Comment puis-je créer une clé composite sur plusieurs colonnes, dont une valeur peut avoir une certaine valeur mais pas null (ou une valeur constante)?
Par exemple: P>
PK Loc_ID Date Time Cancelled 1 1 01/01/2010 10:00AM YES 2 1 01/01/2010 10:00AM YES 3 1 01/01/2010 10:00AM null 4 1 01/01/2010 10:00AM null - Not Acceptable
4 Réponses :
Je ne suis pas sûr que cela soit valide dans Oracle, mais dans PostgreSQL, vous pouvez le faire avec un indice multicolonné partiel sur NULL, à l'exclusion de la colonne null.
CREATE UNIQUE INDEX idx_foo ON example ( Loc_ID, Date, Time ) WHERE canceled IS NULL
Non, Row2 code> 'S
annulé code> n'est pas null, il s'agit d'un index partiel sur NULL. Je suis assez certain que vous pouvez faire cela à Oracle, je ne sais tout simplement pas comment et que cela pourrait être bon ajout aux réponses.
À droite. Vu ça. Je crois que SQL 2008 soutient également cette notion, mais je ne pense pas que l'oracle le fait encore.
Je ne le pense pas, je pense que c'est probablement SQL 99. PostgreSQL l'a soutenu depuis au moins 8 ans.
ALAS Oracle ne supporte pas cette syntaxe.
C'est bon, cela vous donne des choses à rechercher: index partiels code> Faites ce que vous voulez, allez chercher comment les faire à Oracle
Cela pourrait-il être fait avec un index unique basé sur la fonction? Quelque chose comme:
Ne fonctionnera pas dans Oracle pour des cas lorsqu'il sera annulé est «oui» pour la même combinaison de LOC_ID, date, heure.
La version d'APC avec NVL2 () est plus propre et fonctionne clairement, alors que cela n'est pas testé. Juste pour moi-même cependant, je renversant le null, efficacement, qui concerne la même intention; Mais peut-être avoir dû faire décodage (annulé, null,
pk code> ne serait jamais. Ce qui est clairement dangereux en soi, alors ...
Donc, ce que vous pouvez faire respecter une règle où seul enregistrement ne peut être annulé pour une permutation donnée de LOC_ID, date, heure? Nous pouvons le faire avec un index unique basé sur la fonction.
C'est ce que nous voulons éviter: p> construisons un index pour appliquer la règle p> SQL> insert into t34
2 values (4 , 1 , to_date('01/01/2010','DD/MM/YYYY') , '10:00AM', null )
3 /
insert into t34 values (4 , 1 , to_date('01/01/2010','DD/MM/YYYY') , '10:00AM', null )
*
ERROR at line 1:
ORA-00001: unique constraint (APC.T34_UIDX) violated
SQL>
Si la règle est qu'une seule valeur annulée NULL pour une combinaison particulière de LOC_ID, DATE_COL et TIME_COL:
SQL> create table EXAMPLE 2 ( PK number not null, 3 LOC_ID number not null, 4 DATE_COL date null, 5 TIME_COL varchar2(10) null, 6 CANCELLED varchar2(3) null, 7 constraint EXAMPLE_PK primary key (PK) 8 ); Table created. SQL> SQL> create unique index EXAMPLE_UK01 on EXAMPLE 2 (case when CANCELLED is null then LOC_ID else null end, 3 case when CANCELLED is null then DATE_COL else null end, 4 case when CANCELLED is null then TIME_COL else null end 5 ); Index created. SQL> SQL> INSERT INTO EXAMPLE VALUES 2 (1, 1, DATE '2010-01-01', '10:00AM', 'YES'); 1 row created. SQL> SQL> INSERT INTO EXAMPLE VALUES 2 (2, 1, DATE '2010-01-01', '10:00AM', 'YES'); 1 row created. SQL> SQL> INSERT INTO EXAMPLE VALUES 2 (3, 1, DATE '2010-01-01', '10:00AM', null); 1 row created. SQL> SQL> INSERT INTO EXAMPLE VALUES 2 (4, 1, DATE '2010-01-01', '10:00AM', null); INSERT INTO EXAMPLE VALUES * ERROR at line 1: ORA-00001: unique constraint ([schema].EXAMPLE_UK01) violated
Vos exemples données ne permettent aucune base pour rejeter la ligne avec pk = 4 quand il ne rejette pas également celui avec pk = 2.
@Jonathan Leffler - Battez-moi-moi. Avait la même question.
Oui, pk = 2 est ok. Annulé peut avoir une valeur mais pas NULL répétant deux fois pour le même local, la même date et l'heure.
@ M.Burns - Pourquoi la deuxième rangée est-elle ok? Sans le PK, comment un utilisateur a-t-il différencié les données de la ligne 1 de la rangée 2?
@Monsieur. Burns - est PK une colonne de base de données?
Vous ne pourrez pas créer une contrainte basée sur la clé qui répond aux critères dont vous avez besoin.
À mon avis, ce n'est pas possible.
@ Mark Bannister - Toutes les lignes auront d'autres colonnes utilisées pour le but de la piste d'audit. Oui pk est la clé primaire.