对于使用外键的所有列的表的重复删除插入的解决方法

时间:2014-08-05 09:11:53

标签: mysql sql phpmyadmin

我想存储用户'将产品页面添加到数据库中,如我帖子左侧的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;

2 个答案:

答案 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_favoriteuser_id中不存在的表model_id值。而已。您可以从user_favorite删除任何您喜欢的内容而不会产生任何后果。表user_idmodel_id不受影响。

你添加了

ON UPDATE CASCADE
ON DELETE CASCADE;

这样做,当您从表user_id中删除例如用户Tom时,他的所有书签也会被删除,这可能就是您想要的,因为它们不再有意义。 - 没有为其添加书签的用户的书签。
update也是如此。如果您希望更新表model_id中的model_id,则外键约束只能确保书签不会变得无用。它还会更新表model_id中的user_favorite

要实现书签功能,您需要做的就是在点击星标时在user_id中插入model_iduser_favorite的记录,并在他输入时删除相同的条目再次点击这颗星。那就是它。