/ Forside / Teknologi / Udvikling / SQL / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
SQL
#NavnPoint
pmbruun 1704
niller 962
fehaar 730
Interkril.. 701
ellebye 510
pawel 510
rpje 405
pete 350
gibson 320
10  smorch 260
[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 wrote:

> http://troels.arvin.dk/db/rdbms/#constraints-unique

Hva' Troels, har du planer[1] om at medtage SAP DB, eller rettere MaxDB[2],
i dine ganske udmærkede oversigter?

[1] Fra din dide:
.... I will only write about subjects that I've worked with personally, or
subjects which I anticipate to find use for in the near future....

[2] <http://www.mysql.com/products/maxdb/>

--
Med venlig hilsen
Stig Johansen

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



Søg
Reklame
Statistik
Spørgsmål : 177559
Tips : 31968
Nyheder : 719565
Indlæg : 6408937
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste