我想存储用户'将产品页面添加到数据库中,如我帖子左侧的Star-bookmarking,可以在点击的书签和未书签之间切换。我可以使用两列来实现这一目标,一个用于用户' ids和一个产品' IDS?但是,当人们取消对该页面进行书签时,如果两个字段,用户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;
答案 0 :(得分:2)
书签,INSERT
和取消标记DELETE
是两个单独的操作,没有切换功能。
在没有TRIGGER
的情况下执行您所描述内容的唯一方法是添加另一个标记列reversed TINYINT(1) NOT NULL DEFAULT 0
并将复合UNIQUE
键放在(user_id
上,{{1 }})并将model_id
或没有行视为未加标记。
然后你可以运行:
reversed=1
这将在每次运行时更新任何INSERT INTO user_favorite (user_id,model_id) VALUES (**user_id**,**model_id**)
ON DUPLICATE KEY UPDATE reversed = NOT reversed;
,但会给出各种书签历史记录。
然而,我建议以下面 fancyPants 描述的更简单的方式实现该功能。
答案 1 :(得分:0)
我不明白你的问题是什么。你想删除书签,对吧?
外键只是检查插入时是否有父行
在您的情况下,这意味着您无法插入表user_favorite
或user_id
中不存在的表model_id
值。而已。您可以从user_favorite
删除任何您喜欢的内容而不会产生任何后果。表user_id
和model_id
不受影响。
你添加了
ON UPDATE CASCADE
ON DELETE CASCADE;
这样做,当您从表user_id
中删除例如用户Tom时,他的所有书签也会被删除,这可能就是您想要的,因为它们不再有意义。 - 没有为其添加书签的用户的书签。
update
也是如此。如果您希望更新表model_id中的model_id,则外键约束只能确保书签不会变得无用。它还会更新表model_id
中的user_favorite
。
要实现书签功能,您需要做的就是在点击星标时在user_id
中插入model_id
和user_favorite
的记录,并在他输入时删除相同的条目再次点击这颗星。那就是它。