MYSQL上删除级联的例子

时间:2015-03-28 15:33:59

标签: mysql

我无法弄清楚如何在我的示例中使用on delete cascade

CREATE TABLE `users` (
  `login` varchar(16) NOT NULL,
  `password` varchar(16) NOT NULL,
  PRIMARY KEY (`login`),
  UNIQUE KEY `login` (`login`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

CREATE TABLE `employees` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `Name` varchar(20) NOT NULL,
  `Surname` varchar(25) NOT NULL,
  `Birthday` date NOT NULL,
  `Adres` varchar(50) NOT NULL,
  `Telephone` varchar(25) NOT NULL,
  `login` varchar(16) DEFAULT NULL,
  PRIMARY KEY (`ID`),
  UNIQUE KEY `login` (`login`),
  CONSTRAINT `employees_ibfk_1` FOREIGN KEY (`login`) REFERENCES `users` (`login`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

一个表存储有关员工的信息,如果他有帐户(登录),则会有另一个包含登录名和密码的表。

我的目标:

  1. 并非每个员工都需要拥有用户帐户(这意味着 - Users表中的唯一记录),因此Employees.Login不应该使用NOT NULL进行限制。
  2. 我希望可以在Users中添加新用户,然后将其分配给某个员工。
  3. 当我删除员工时,相关的唯一身份用户也会被删除(如果有的话)。
  4. 前两个已经完成。我现在不知道怎么做 3

3 个答案:

答案 0 :(得分:1)

您已将CONSTRAINT置于错误的CREATE TABLE语句中。它继续引用表"users",因为这是您希望在删除另一个表中的行时自动删除的表。

您希望在"ID"表中放置一个可为空的"users",该表是唯一的,并且是"employees"的外键。

答案 1 :(得分:0)

使用此查询:

        CREATE TABLE `users` (
      `login` varchar(16) NOT NULL,
      `password` varchar(16) NOT NULL,
      PRIMARY KEY (`login`),
      UNIQUE KEY `login` (`login`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;


    CREATE TABLE `employees` (
      `ID` int(11) NOT NULL AUTO_INCREMENT,
      `Name` varchar(20) NOT NULL,
      `Surname` varchar(25) NOT NULL,
      `Birthday` date NOT NULL,
      `Adres` varchar(50) NOT NULL,
      `Telephone` varchar(25) NOT NULL,
      `login` varchar(16) DEFAULT NULL,
      PRIMARY KEY (`ID`),
      UNIQUE KEY `login` (`login`),
      CONSTRAINT `employees_ibfk_1` FOREIGN KEY (`login`) REFERENCES `users` (`login`)  ON DELETE CASCADE
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

答案 2 :(得分:0)

基于 Hammerite 的建议,现在我的表格定义如下:

CREATE TABLE `employees` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `Name` varchar(20) NOT NULL,
  `Surname` varchar(25) NOT NULL,
  `Birthday` date NOT NULL,
  `Adres` varchar(50) NOT NULL,
  `Telephone` varchar(25) NOT NULL,
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

CREATE TABLE `users` (
  `login` varchar(16) NOT NULL,
  `password` varchar(16) NOT NULL,
  `employee_id` int(11) NOT NULL,
  PRIMARY KEY (`login`),
  UNIQUE KEY `login` (`login`),
  UNIQUE KEY `employee_id` (`employee_id`),
  CONSTRAINT `users_ibfk_1` FOREIGN KEY (`employee_id`) REFERENCES `employees` (`ID`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8
  1. 我已从login
  2. 中删除了employees
  3. 我在employee_id表格中创建了另一列User。它是唯一的外键,不能为空,因为我不想要任何人都不使用的用户帐户。
  4. 现在如果我这样做:

    INSERT INTO users VALUES('login123','password',2);
    

    然后我执行此操作后将删除此行:

    DELETE FROM employees WHERE id=2;
    

    我确信我需要在employees表到users表中进行一些引用,这就是为什么我没有考虑这样的解决方案。

    谢谢!