Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Batasi dengan pemeriksaan nilai bersyarat di MySQL

Menurut dokumentasi ,

Jadi hapus not null -kendala dari Status dan menambahkan indeks unik pada (ContactId,PhoneId,Status) akan berfungsi seperti yang Anda inginkan, jika Anda menggunakan null bukannya 0 untuk tidak aktif catatan.

Jika Anda tidak ingin atau tidak dapat menggunakan null untuk Status . Anda kolom, ingin memastikan keduanya Status=0 dan Status=null berperilaku identik, atau mis. ingin memperlakukan Status=2 sebagai aktif (dan menegakkan keunikan) juga, Anda dapat menambahkan kolom dummy yang akan dihitung dari Status .

Jika Anda menggunakan MySQL 5.7+, Anda dapat melakukannya dengan kolom yang dibuat:

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 

Jika tidak, Anda dapat menggunakan kolom normal dan menggunakan pemicu untuk menghitung nilai kolom, mis.:

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);

Anda tentu saja dapat mengganti rumus ke mis. if(new.Status <> 0, new.Status, null); jika Anda ingin mengizinkan nilai yang berbeda dari Status juga.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Masukkan kunci utama kenaikan otomatis ke tabel yang ada

  2. Nilai kolom konstan di tabel MySQL

  3. Peringatan:mysql_error():argumen yang diberikan bukan sumber MySQL-Link yang valid

  4. Cara menulis kueri MySQL di mana A berisi ( a atau b )

  5. Ketidakcocokan antara nilai DATETIME dalam database H2 dan MySQL yang disisipkan dari Java/Kotlin