Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Egzekwuj unikalne wartości w dwóch tabelach

Nie można zadeklarować ograniczenia UNIQUE w wielu tabelach, a MySQL w ogóle nie obsługuje ograniczeń CHECK. Ale możesz zaprojektować wyzwalacz, aby wyszukać pasującą wartość w drugiej tabeli. Oto testowy skrypt 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

Potrzebujesz również podobnych wyzwalaczy PRZY UAKTUALNIENIU dla każdej tabeli, ale nie powinieneś potrzebować żadnych wyzwalaczy PRZY USUWANIU.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Nieprawidłowy typ błędu składni =MyISAM w DDL wygenerowany przez Hibernate

  2. Jak znaleźć najbliższą lokalizację na podstawie szerokości i długości geograficznej z bazy danych SQL?

  3. PHP:aktualizacja duplikacji zapytań MySQL bez powodu

  4. Dlaczego może istnieć tylko jedna kolumna TIMESTAMP z CURRENT_TIMESTAMP w klauzuli DEFAULT?

  5. 193:%1 nie jest poprawnym błędem aplikacji Win32 z nową aplikacją Rails