Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 对于所有列都使用外键的表,在重复删除时插入的变通方法_Mysql_Sql_Phpmyadmin - Fatal编程技术网

Mysql 对于所有列都使用外键的表,在重复删除时插入的变通方法

Mysql 对于所有列都使用外键的表,在重复删除时插入的变通方法,mysql,sql,phpmyadmin,Mysql,Sql,Phpmyadmin,我想将用户的书签产品页面存储到数据库中,就像我文章左侧的星形书签一样,点击后可以在书签和未书签之间切换。我可以使用两列来实现这一点,一列用于用户ID,另一列用于产品ID吗?但是,如果用户id和产品id这两个字段都是外键,那么当人们取消标记页面时,如何删除记录呢 PS.更新外键语句 表结构 CREATE TABLE user_favorite (`USER_ID` int, `MODEL_ID` int) ; INSERT INTO user_favorite (`USER_ID

我想将用户的书签产品页面存储到数据库中,就像我文章左侧的星形书签一样,点击后可以在书签和未书签之间切换。我可以使用两列来实现这一点,一列用于用户ID,另一列用于产品ID吗?但是,如果用户id和产品id这两个字段都是外键,那么当人们取消标记页面时,如何删除记录呢

PS.更新外键语句

表结构

CREATE TABLE user_favorite
    (`USER_ID` int, `MODEL_ID` int)
;

INSERT INTO user_favorite
    (`USER_ID`,`MODEL_ID`)
VALUES
    (1, '2'),
    (2, '3'),
    (3, '1'),
    (4, '1'),
    (5, '1')
;

CREATE TABLE USER_ID
    (`USER_ID` int, `USER` varchar(20))
;

INSERT INTO USER_ID
    (`USER_ID`,`USER`)
VALUES
    (1, 'Tom'),
    (2, 'Mary'),
    (3, 'Paul'),
    (4, 'Peter'),
    (5, 'John')
;


CREATE TABLE MODEL_ID
    (`MODEL_ID` int, `MODEL` varchar(20))
;

INSERT INTO MODEL_ID
    (`MODEL_ID`,`MODEL`)
VALUES
    (1, 'ToyA'),
    (2, 'ToyB'),
    (3, 'ToyC')
;

ALTER TABLE user_favorite
ADD CONSTRAINT FK_userfav_user_id 
FOREIGN KEY (USER_ID) REFERENCES USER_ID(USER_ID) 
ON UPDATE CASCADE
ON DELETE CASCADE;

ALTER TABLE user_favorite
ADD CONSTRAINT FK_userfav_model_id 
FOREIGN KEY (MODEL_ID) REFERENCES Model_ID(MODEL_ID) 
ON UPDATE CASCADE
ON DELETE CASCADE;

书签、
INSERT
和取消书签、
DELETE
是两个独立的操作,没有切换功能

在不使用
触发器的情况下执行所述操作的唯一方法是添加另一个标志列
反向TINYINT(1)NOTNULL DEFAULT 0
,并将复合
UNIQUE
键置于(
用户id
模型id
)上,并将
反向=1
或无行视为未标记

然后您可以运行:

INSERT INTO user_favorite (user_id,model_id) VALUES (**user_id**,**model_id**)
    ON DUPLICATE KEY UPDATE reversed = NOT reversed;
这将在每次运行时更新任何
AUTO_INCREMENT
,但会给出各种书签历史记录


但是,我建议您以下面fancyPants描述的更简单的方式实现该功能。

我不明白您的问题是什么。你想删除书签,对吗

插入时,外键只检查是否存在父行。
在您的情况下,这意味着您不能在表
user\u favorite
中插入表
user\u id
model\u id
中不存在的值。没别的了。您可以从
user\u favorite
中删除任何您喜欢的内容,而不会产生任何后果。表
user\u id
model\u id
不受影响

你补充说

ON UPDATE CASCADE
ON DELETE CASCADE;
这样做的目的是,当您从表
user\u id
中删除例如用户Tom时,他的所有书签也会被删除,这可能是您想要的,因为它们已经没有意义了-没有为它们添加书签的用户的书签。
与更新相同。如果希望更新表model_id中的model_id,则外键约束只会确保书签不会变得无用。它还会更新表
用户最喜爱的
中的
型号id


要实现书签功能,只需在单击星号时在
user\u favorite
中插入一条带有
user\u id
model\u id
的记录,并在再次单击星号时删除相同的条目。就是这样。

要简化删除,请在
用户收藏夹
中添加一个
id自动增量
。通过id字段,应该可以很容易地识别您想要删除的记录。@devanand,我在另一个线程中看到mysql中没有重复删除时插入的
INSERT
,我需要使用两个查询,
INSERT IGNORE
REPLACE
还是创建一个触发器?