|
| [mssql] Unique Constraint men tillad Null Fra : Jens Gyldenkærne Cla~ |
Dato : 14-01-04 17:48 |
|
Jeg har en tabel med to fremmednøgler - ITID og regID. Jeg vil
gerne lave en constraint der sikrer at værdierne i de to felter
enten er NULL eller også er unikke (en ITID-værdi må kun optræde én
gang i tabellen - tilsvarende med regID).
Er der en smart måde at gøre det på?
Jeg skal også have et tjek der sikrer at kun ét af de to felter er
udfyldt - men det tror jeg godt jeg selv kan lave.
--
Jens Gyldenkærne Clausen
Svar venligst under det du citerer, og citer kun det der er
nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
hvordan på http://usenet.dk/netikette/citatteknik.html
| |
Troels Arvin (14-01-2004)
| Kommentar Fra : Troels Arvin |
Dato : 14-01-04 20:11 |
|
On Wed, 14 Jan 2004 17:47:34 +0100, Jens Gyldenkærne Clausen wrote:
> Jeg har en tabel med to fremmednøgler - ITID og regID. Jeg vil
> gerne lave en constraint der sikrer at værdierne i de to felter
> enten er NULL eller også er unikke
Så vælg et DBMS, der følger standarden for UNIQUE
--
Greetings from Troels Arvin, Copenhagen, Denmark
| |
Jens Gyldenkærne Cla~ (15-01-2004)
| Kommentar Fra : Jens Gyldenkærne Cla~ |
Dato : 15-01-04 10:18 |
|
Troels Arvin skrev:
>> Jeg har en tabel med to fremmednøgler - ITID og regID. Jeg
>> vil gerne lave en constraint der sikrer at værdierne i de to
>> felter enten er NULL eller også er unikke
>
> Så vælg et DBMS, der følger standarden for UNIQUE
Det er måske nok at gøre lidt meget ud af det. Jeg tror hellere at
jeg vil klare mig uden en constraint frem for at skulle flytte et
eller flere færdige systemer til en ny database.
Er der ikke en måde at gøre det på i MSSQL?
--
Jens Gyldenkærne Clausen
Svar venligst under det du citerer, og citer kun det der er
nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
hvordan på http://usenet.dk/netikette/citatteknik.html
| |
Peter Lykkegaard (15-01-2004)
| Kommentar Fra : Peter Lykkegaard |
Dato : 15-01-04 12:58 |
|
"Jens Gyldenkærne Clausen" wrote in a message
> Troels Arvin skrev:
>
> >> Jeg har en tabel med to fremmednøgler - ITID og regID. Jeg
> >> vil gerne lave en constraint der sikrer at værdierne i de to
> >> felter enten er NULL eller også er unikke
> >
> > Så vælg et DBMS, der følger standarden for UNIQUE
>
> Er der ikke en måde at gøre det på i MSSQL?
Du kan evt lave en insert trigger, men det bliver noget snavs i MSSQL
Den tillader ikke null i alm contraints svjv
- Peter
| |
Kristian Damm Jensen (15-01-2004)
| Kommentar Fra : Kristian Damm Jensen |
Dato : 15-01-04 12:56 |
|
Peter Lykkegaard wrote:
> "Jens Gyldenkærne Clausen" wrote in a message
>
>> Troels Arvin skrev:
>>
>>>> Jeg har en tabel med to fremmednøgler - ITID og regID. Jeg
>>>> vil gerne lave en constraint der sikrer at værdierne i de to
>>>> felter enten er NULL eller også er unikke
>>>
>>> Så vælg et DBMS, der følger standarden for UNIQUE
>>
>> Er der ikke en måde at gøre det på i MSSQL?
>
> Du kan evt lave en insert trigger, men det bliver noget snavs i
MSSQL
> Den tillader ikke null i alm contraints svjv
Hvorfor bliver det noget snavs?
Virker
exists (select * from Tabel where ITID is not null group by ITID
having count(*) > 1)
da ikke?
--
Kristian Damm Jensen
damm (at) ofir (dot) dk
| |
Peter Lykkegaard (15-01-2004)
| Kommentar Fra : Peter Lykkegaard |
Dato : 15-01-04 15:45 |
|
"Kristian Damm Jensen" wrote in a message
> Hvorfor bliver det noget snavs?
>
> Virker
>
> exists (select * from Tabel where ITID is not null group by ITID
> having count(*) > 1)
>
> da ikke?
>
Jow da, men det kan gå hen og give lidt performance issues ved mange inserts
Det er to felter der skal tjekkes
- Peter
| |
Kristian Damm Jensen (15-01-2004)
| Kommentar Fra : Kristian Damm Jensen |
Dato : 15-01-04 20:45 |
|
Peter Lykkegaard wrote:
> "Kristian Damm Jensen" wrote in a message
>
>
>> Hvorfor bliver det noget snavs?
>>
>> Virker
>>
>> exists (select * from Tabel where ITID is not null group by ITID
>> having count(*) > 1)
>>
>> da ikke?
>>
> Jow da, men det kan gå hen og give lidt performance issues ved mange
> inserts Det er to felter der skal tjekkes
Selvfølgelig. Jeg troede ikke du med "snavs" tænkte på performance.
Men der kan under alle omstændigheder hentes en del ind igen ved at
justere til
exists (select * from Tabel join Inserted on Tabel.ITID =
Inserted.ITID
where ITID is not null
group by ITID
having count(*) > 1)
og så et index på ITID.
--
Kristian Damm Jensen
damm (at) ofir (dot) dk
| |
Troels Arvin (15-01-2004)
| Kommentar Fra : Troels Arvin |
Dato : 15-01-04 13:04 |
|
On Thu, 15 Jan 2004 12:57:31 +0100, Peter Lykkegaard wrote:
> Den tillader ikke null i alm contraints svjv
Hvad mener du med det?
--
Greetings from Troels Arvin, Copenhagen, Denmark
| |
Peter Lykkegaard (15-01-2004)
| Kommentar Fra : Peter Lykkegaard |
Dato : 15-01-04 16:07 |
|
"Troels Arvin" <troels@arvin.dk> wrote in message
news:pan.2004.01.15.12.04.00.755879@arvin.dk...
> On Thu, 15 Jan 2004 12:57:31 +0100, Peter Lykkegaard wrote:
>
> > Den tillader ikke null i alm contraints svjv
>
> Hvad mener du med det?
>
Jeg har lige kikket lidt på det, og et alternativ til primary key contraint
er så et unique constraint (der tillader null, men ikke duplicate keys)
Tilbage står så at tjekke at kun det ene felt er udfyldt i en insert/update
trigger eller en check constraint
Jeg sad og spekulerede lidt over det, og man kan ligeså godt falde i end
holde sig tilbage
Der er jo chance for at man kan lære noget
Det er ikke de store behov jeg har haft for constraints (endnu)
Men det kan da være at det kommer når man har lært dem at kende
- Peter
| |
Peter Lykkegaard (15-01-2004)
| Kommentar Fra : Peter Lykkegaard |
Dato : 15-01-04 16:15 |
|
"Peter Lykkegaard" <polonline@hotmail.com> wrote in message
news:70yNb.2960$9l.1598@news.get2net.dk...
>
> Jeg har lige kikket lidt på det, og et alternativ til primary key
contraint
> er så et unique constraint (der tillader null, men ikke duplicate keys)
Arghh, unique constraint tillader åbentbart kun een row med null
- Peter
| |
Troels Arvin (15-01-2004)
| Kommentar Fra : Troels Arvin |
Dato : 15-01-04 16:28 |
|
On Thu, 15 Jan 2004 16:15:24 +0100, Peter Lykkegaard wrote:
> Arghh, unique constraint tillader åbentbart kun een row med null
Ja, men da dette ikke er en MSSQL-specifik gruppe, synes jeg det vigtigt
lige at nævne, at dette forhold ikke er universelt gældende:
http://troels.arvin.dk/db/rdbms/#constraints-unique
--
Greetings from Troels Arvin, Copenhagen, Denmark
| |
Peter Lykkegaard (15-01-2004)
| Kommentar Fra : Peter Lykkegaard |
Dato : 15-01-04 16:40 |
|
"Troels Arvin" <troels@arvin.dk> wrote in message
news:pan.2004.01.15.15.27.32.593782@arvin.dk...
> On Thu, 15 Jan 2004 16:15:24 +0100, Peter Lykkegaard wrote:
>
> > Arghh, unique constraint tillader åbentbart kun een row med null
>
> Ja, men da dette ikke er en MSSQL-specifik gruppe, synes jeg det vigtigt
> lige at nævne, at dette forhold ikke er universelt gældende:
> http://troels.arvin.dk/db/rdbms/#constraints-unique
>
Subject er prefixet med mssql det burde være dækkende
Men du har da ret
- Peter
| |
Stig Johansen (16-01-2004)
| Kommentar Fra : Stig Johansen |
Dato : 16-01-04 06:09 |
| | |
Troels Arvin (16-01-2004)
| Kommentar Fra : Troels Arvin |
Dato : 16-01-04 08:48 |
|
On Fri, 16 Jan 2004 06:09:19 +0100, Stig Johansen wrote:
> har du planer[1] om at medtage SAP DB, eller rettere MaxDB[2]
Ja, men ikke umiddelbart. Jeg vil sandsynligvis snarere kigge på
MimerSQL eller Firebird, når jeg på et tidspunkt udvider "sortimentet";
mht. Firebird så skal den dog lige ud af release candidate cyklus først.
MimerSQL overvejer jeg at tage med, da jeg alligevel normalt også tester
i den, fordi den er så tæt på at være SQL reference-implementation.
--
Greetings from Troels Arvin, Copenhagen, Denmark
| |
Jens Gyldenkærne Cla~ (15-01-2004)
| Kommentar Fra : Jens Gyldenkærne Cla~ |
Dato : 15-01-04 16:12 |
|
Peter Lykkegaard skrev:
> Jeg har lige kikket lidt på det, og et alternativ til primary
> key contraint er så et unique constraint (der tillader null,
> men ikke duplicate keys)
Hvordan opretter du den?
Hvis jeg prøver via EM får jeg følgende fejl:
- Unable to create index 'IX_bannerKategorierITID'.
ODBC error: [Microsoft][ODBC SQL Server Driver][SQL Server]CREATE
UNIQUE INDEX terminated because a duplicate key was found for index
ID 4. Most significant primary key is '<NULL>'.
[Microsoft][ODBC SQL Server Driver][SQL Server]Could not create
constraint. See previous errors.
--
Jens Gyldenkærne Clausen
Svar venligst under det du citerer, og citer kun det der er
nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
hvordan på http://usenet.dk/netikette/citatteknik.html
| |
Peter Lykkegaard (15-01-2004)
| Kommentar Fra : Peter Lykkegaard |
Dato : 15-01-04 16:27 |
|
"Jens Gyldenkærne Clausen" wrote in a message
> Peter Lykkegaard skrev:
>
> > Jeg har lige kikket lidt på det, og et alternativ til primary
> > key contraint er så et unique constraint (der tillader null,
> > men ikke duplicate keys)
>
> Hvordan opretter du den?
>
> Hvis jeg prøver via EM får jeg følgende fejl:
>
> - Unable to create index 'IX_bannerKategorierITID'.
> ODBC error: [Microsoft][ODBC SQL Server Driver][SQL Server]CREATE
> UNIQUE INDEX terminated because a duplicate key was found for index
> ID 4. Most significant primary key is '<NULL>'.
> [Microsoft][ODBC SQL Server Driver][SQL Server]Could not create
> constraint. See previous errors.
Det skal være Constraint i stedet for Index - men det hjælper ikke så meget
Du kan kun have een række/kolonne med Null
- Peter
| |
Jens Gyldenkærne Cla~ (15-01-2004)
| Kommentar Fra : Jens Gyldenkærne Cla~ |
Dato : 15-01-04 22:52 |
|
Kristian Damm Jensen skrev:
> exists (select * from Tabel join Inserted on Tabel.ITID =
> Inserted.ITID
Kan man ikke optimere en smule mere ved at erstatte * med fx 1? Det
er jo ligegyldigt hvad der hentes i en exists-forespørgsel.
Min sql-bog bruger "... WHERE EXISTS (SELECT 't' FROM ...)" - jeg
plejer at bruge 2 tegn mindre:
"... WHERE EXISTS (SELECT 1 FROM ...)
--
Jens Gyldenkærne Clausen
»Diplomatiet består netop i, at de gamle kommatister kan få lov til
at tro, at de har vundet. Men i virkeligheden har de tabt.«
Ole Togeby i Information
| |
Kristian Damm Jensen (16-01-2004)
| Kommentar Fra : Kristian Damm Jensen |
Dato : 16-01-04 05:53 |
|
Jens Gyldenkærne Clausen wrote:
> Kristian Damm Jensen skrev:
>
>> exists (select * from Tabel join Inserted on Tabel.ITID =
>> Inserted.ITID
>
> Kan man ikke optimere en smule mere ved at erstatte * med fx 1? Det
> er jo ligegyldigt hvad der hentes i en exists-forespørgsel.
>
> Min sql-bog bruger "... WHERE EXISTS (SELECT 't' FROM ...)" - jeg
> plejer at bruge 2 tegn mindre:
> "... WHERE EXISTS (SELECT 1 FROM ...)
Det afhænger vist af DBMS'et. I nogle er det ligegyldigt, i andre (fx
Ingres) har det stor betydning. (En god optimering bør kunne
gennemskue, at en "exist (select * ...) ikke handler om at finde
specifikke data.)
--
Kristian Damm Jensen
damm (at) ofir (dot) dk
| |
Jens Gyldenkærne Cla~ (16-01-2004)
| Kommentar Fra : Jens Gyldenkærne Cla~ |
Dato : 16-01-04 10:00 |
|
Kristian Damm Jensen skrev:
> Det afhænger vist af DBMS'et. I nogle er det ligegyldigt, i
> andre (fx Ingres) har det stor betydning.
O.k. Ved du hvilken gruppe MSSQL hører til?
> (En god optimering bør kunne gennemskue, at en "exist (select *
> ...) ikke handler om at finde specifikke data.)
Det har du selvfølgelig ret i.
--
Jens Gyldenkærne Clausen
Svar venligst under det du citerer, og citer kun det der er
nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
hvordan på http://usenet.dk/netikette/citatteknik.html
| |
Kristian Damm Jensen (16-01-2004)
| Kommentar Fra : Kristian Damm Jensen |
Dato : 16-01-04 12:30 |
|
Jens Gyldenkærne Clausen wrote:
> Kristian Damm Jensen skrev:
>
>> Det afhænger vist af DBMS'et. I nogle er det ligegyldigt, i
>> andre (fx Ingres) har det stor betydning.
>
> O.k. Ved du hvilken gruppe MSSQL hører til?
Næh, jeg har ikke daglig adgang til MSSQL. Men det burde være relativt
simpelt at teste.
--
Kristian Damm Jensen
damm (at) ofir (dot) dk
| |
|
|