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

Ograniczenie z warunkowym sprawdzaniem wartości w MySQL

Według dokumentacji ,

Więc usunięcie not null -Ograniczenie z Status i dodanie unikalnego indeksu na (ContactId,PhoneId,Status) będzie działać tak, jak chcesz, jeśli użyjesz null zamiast 0 dla nieaktywnych rekordy.

Jeśli nie chcesz lub nie możesz użyć null dla twojego Status kolumna, chcę się upewnić, że oba Status=0 i Status=null zachowują się identycznie, czyli np. chcesz leczyć Status=2 jako aktywny (i wymuszając unikalność), możesz również dodać fikcyjną kolumnę, która będzie obliczana na podstawie Status .

Jeśli używasz MySQL 5.7+, możesz to zrobić za pomocą wygenerowanej kolumny:

CREATE TABLE IF NOT EXISTS `ContactPhone` (
  `ContactPhoneId` int(10) unsigned NOT NULL auto_increment primary key,
  `ContactId` int(11) NOT NULL,
  `PhoneId` smallint(5) unsigned NOT NULL,
  `Status` tinyint(1) NOT NULL DEFAULT '1',
  `StatusUnq` tinyint(1) as (if(Status <> 0, 1, null)) stored null,
  constraint unique (ContactId, PhoneId, StatusUnq)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=latin1;

insert into ContactPhone (ContactPhoneId, ContactId, PhoneId, Status)
values (1, 1, 1, 1);
insert into ContactPhone (ContactPhoneId, ContactId, PhoneId, Status)
values (2, 1, 1, 1);
-- Duplicate key error 
insert into ContactPhone (ContactPhoneId, ContactId, PhoneId, Status)
values (3, 1, 1, 0);
insert into ContactPhone (ContactPhoneId, ContactId, PhoneId, Status)
values (4, 1, 1, 0);
update ContactPhone set Status = 1 where ContactPhoneId = 4;
-- Duplicate key error 

W przeciwnym razie możesz użyć zwykłej kolumny i użyć wyzwalaczy do obliczenia wartości kolumny, np.:

create trigger trbi_contactPhoneUnique before insert on ContactPhone 
for each row
  set new.StatusUnq = if(new.Status <> 0, 1, null);

create trigger trbu_contactPhoneUnique before update on ContactPhone 
for each row
  set new.StatusUnq = if(new.Status <> 0, 1, null);

Formułę można oczywiście przełączyć na m.in. if(new.Status <> 0, new.Status, null); jeśli chcesz zezwolić na różne wartości Status także.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. jak stworzyć pole obliczeniowe w mysql?

  2. Jak uzyskać resztę za pomocą MOD() w PostgreSQL, MS SQL Server i MySQL?

  3. Narzędzie do tworzenia diagramów ER typu open source dla mysql

  4. BŁĄD [IM014] [Microsoft][Menedżer sterowników ODBC] Określony DSN zawiera niezgodność architektury między sterownikiem a aplikacją

  5. MySQL, sprawdź, czy kolumna istnieje w tabeli z SQL