sql >> Database >  >> RDS >> Mysql

Unieke waarden afdwingen over twee tabellen

U kunt een UNIQUE-beperking niet voor meerdere tabellen declareren en MySQL ondersteunt helemaal geen CHECK-beperkingen. Maar u kunt een trigger ontwerpen om naar de overeenkomende waarde in de andere tabel te zoeken. Hier is een test SQL-script:

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

Je hebt ook gelijkaardige triggers ON UPDATE nodig voor elke tafel, maar je zou geen triggers ON DELETE nodig moeten hebben.



  1. Codeigniter db->update() VS MySQL native UPDATE Betrokken rijen:0

  2. Hoe importeer je eenvoudig meerdere sql-bestanden in een MySQL-database?

  3. Verschil tussen NullIf() en IfNull() in SQLite

  4. com.mysql.jdbc.exceptions.MySQLSyntaxErrorException bij gebruik van PreparedStatement