【问题标题】:One to one relationship in MySQL and cascade deleteMySQL中的一对一关系和级联删除
【发布时间】:2014-06-13 10:20:08
【问题描述】:

我有两个表:用户和管理员。

+-------------------------+
| TABLE : user
+-------------------------+
| id: PRIMARY_KEY
| username
| password
+-------------------------+

+-------------------------+
| TABLE: admin
+-------------------------+
| user_id: FOREIGN_KEY
| e-mail
+-------------------------+

管理员也是用户,因此,两个表的关系是 1:1。当从 User 表中删除一行时,它也会从表 Admin 中删除(在 admin.user_id 设置关系 ON DELETE CASCADE),但是如果我从表 Admin 中删除一行怎么办?然后它不会从 User 表中删除,这会在数据库中造成混乱。这是任何解决方案吗?如何实现双方的关系?

【问题讨论】:

    标签: mysql relational-database relationship one-to-one cascading-deletes


    【解决方案1】:

    admin表添加相似的外键-

    ALTER TABLE user
      ADD CONSTRAINT FK_user_admin_user_id FOREIGN KEY (id)
        REFERENCES admin(user_id) ON DELETE CASCADE ON UPDATE RESTRICT;
    

    现在,您可以从useradmin 表中删除行,相关记录将被删除。

    使用 FOREIGN_KEY_CHECKS 变量添加新记录,例如-

    SET FOREIGN_KEY_CHECKS = 0;
    
    INSERT INTO user(id) VALUES(1);
    INSERT INTO admin(user_id) VALUES(1);
    
    SET FOREIGN_KEY_CHECKS = 1;
    

    带输出的完整示例 -

    CREATE TABLE user (
      id int(11) NOT NULL AUTO_INCREMENT,
      username varchar(255) DEFAULT NULL,
      password varchar(255) DEFAULT NULL,
      PRIMARY KEY (id),
      CONSTRAINT FK_user_admin_user_id FOREIGN KEY (id)
      REFERENCES admin (user_id) ON DELETE CASCADE ON UPDATE RESTRICT
    )
    ENGINE = INNODB;
    
    CREATE TABLE admin (
      user_id int(11) NOT NULL AUTO_INCREMENT,
      `e-mail` varchar(255) DEFAULT NULL,
      PRIMARY KEY (user_id),
      CONSTRAINT FK_admin_user_id FOREIGN KEY (user_id)
      REFERENCES user (id) ON DELETE CASCADE ON UPDATE RESTRICT
    )
    ENGINE = INNODB;
    
    SET FOREIGN_KEY_CHECKS = 0;
    
    INSERT INTO user(id) VALUES(1);
    INSERT INTO user(id) VALUES(2);
    INSERT INTO user(id) VALUES(3);
    
    INSERT INTO admin(user_id) VALUES(1);
    INSERT INTO admin(user_id) VALUES(2);
    INSERT INTO admin(user_id) VALUES(3);
    
    SET FOREIGN_KEY_CHECKS = 1;
    
    DELETE FROM user WHERE id = 1;
    DELETE FROM admin WHERE user_id = 2;
    
    SELECT * FROM user;
    +----+----------+----------+
    | id | username | password |
    +----+----------+----------+
    |  3 | NULL     | NULL     |
    +----+----------+----------+
    
    SELECT * FROM admin;
    +---------+--------+
    | user_id | e-mail |
    +---------+--------+
    |       3 | NULL   |
    +---------+--------+
    

    【讨论】:

    • 一切正常。只有一个问题,因为不是每个用户都是管理员。我很糟糕地澄清了这种关系。而是一对零或一的关系。
    • 您能详细介绍一下这个问题吗?
    • 在我的应用程序中是管理员、教师和学生。每种类型的用户都可以为您的群组操作执行特征(也有自己的特定数据,例如只有老师有课,只有学生有朋友等)。但是他们每个人都是我的应用程序的用户,并且有登录名、密码、电子邮件、名字、姓氏等。例如,在 PHP 中,类 Student 继承了 User 类。从数据库的角度来看,users 是普通数据的表,admins、teacher、students 是特定数据的表。
    • 问题是从users表中删除一行会删除admins表的对应行,教师或学生,反之则不行。例如,从 admins 表中删除一行不会从 users 表中删除一行。
    • 我添加了包含 CREATE TABLE、INSERT 和 DELETE 语句的完整示例。
    猜你喜欢
    • 1970-01-01
    • 2018-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-03
    • 2011-03-01
    • 2020-07-27
    • 1970-01-01
    相关资源
    最近更新 更多