Mysql 对于所有列都使用外键的表,在重复删除时插入的变通方法
我想将用户的书签产品页面存储到数据库中,就像我文章左侧的星形书签一样,点击后可以在书签和未书签之间切换。我可以使用两列来实现这一点,一列用于用户ID,另一列用于产品ID吗?但是,如果用户id和产品id这两个字段都是外键,那么当人们取消标记页面时,如何删除记录呢 PS.更新外键语句 表结构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
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
还是创建一个触发器?