在两个表中强制使用唯一值

nic*_*ckf 14 mysql indexing

是否可以在MySQL中的两个表中强制实现唯一性?

我有两个表,都描述用户.这些表中的用户以前用于两个不同的系统,但是现在我们正在合并我们的身份验证系统,我需要确保这两个表中有唯一的用户名.(现在将它们全部放入一个表中是太多的工作).

Bil*_*win 17

您不能在多个表之间声明UNIQUE约束,并且MySQL根本不支持CHECK约束.但是您可以设计一个触发器来搜索另一个表中的匹配值.这是一个测试SQL脚本:

DROP TABLE IF EXISTS foo;
CREATE TABLE FOO (username VARCHAR(10) NOT NULL);

DROP TABLE IF EXISTS bar;
CREATE TABLE BAR (username VARCHAR(10) NOT NULL);

DROP TRIGGER IF EXISTS unique_foo;
DROP TRIGGER IF EXISTS unique_bar;

DELIMITER //

CREATE TRIGGER unique_foo BEFORE INSERT ON foo
FOR EACH ROW BEGIN
  DECLARE c INT;
  SELECT COUNT(*) INTO c FROM bar WHERE username = NEW.username;
  IF (c > 0) THEN
    -- abort insert, because foo.username should be NOT NULL
    SET NEW.username = NULL;
  END IF;
END//

CREATE TRIGGER unique_bar BEFORE INSERT ON bar
FOR EACH ROW BEGIN
  DECLARE c INT;
  SELECT COUNT(*) INTO c FROM foo WHERE username = NEW.username;
  IF (c > 0) THEN
    -- abort insert, because bar.username should be NOT NULL
    SET NEW.username = NULL;
  END IF;
END//

DELIMITER ;

INSERT INTO foo VALUES ('bill');  -- OK

INSERT INTO bar VALUES ('bill');  -- Column 'username' cannot be null
Run Code Online (Sandbox Code Playgroud)

对于每个表,您还需要类似的触发器ON UPDATE,但是您不需要任何触发器ON DELETE.


Mny*_*kka 5

最好的方法是用唯一的列声明另一个表,并让多个表引用这些表

  • 我认为这实际上没有帮助,因为没有什么可以阻止来自不同表的 2 条记录引用第三个表上的相同唯一列。也许你可以用某种多态关联来做到这一点。 (3认同)

cli*_*ers 0

显然,如果两个表中已经存在重复项,您将必须手动解决该问题。展望未来,您可以编写一个触发器来检查两个表以查看该值是否已存在,然后将其应用于两个表。