Mysql
 sql >> Base de données >  >> RDS >> Mysql

Appliquer des valeurs uniques sur deux tables

Vous ne pouvez pas déclarer une contrainte UNIQUE sur plusieurs tables et MySQL ne prend pas du tout en charge les contraintes CHECK. Mais vous pouvez concevoir un déclencheur pour rechercher la valeur correspondante dans l'autre table. Voici un script SQL de test :

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

Vous avez également besoin de déclencheurs similaires ON UPDATE pour chaque table, mais vous ne devriez pas avoir besoin de déclencheurs ON DELETE.