Toon posts:

[MSSQL] dubbele PK not NULL

Pagina: 1
Acties:
  • 164 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Hallo mensen,

Ik heb een tabel aangemaakt waarin ik gebruik maak van een dubbele Primary Key. (2 kolommen die samen 1 PK vormen)

Normaliter is een PK automatisch not NULL en werkt dit ook naar behoren.
Nu ik gebruik maak van een dubbele PK kan ik ineens wel NULL waarden invoeren (terwijl de database aangeeft dat de kolommen not NULL zijn).
Dit is niet de bedoeling.

Weet iemand hoe ik dit kan oplossen?

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

Huh? Geef eens het 'create table' script?

Professionele website nodig?


Verwijderd

Topicstarter
Ik heb hem handmatig aangemaakt:

Afbeeldingslocatie: http://www.joined-forces.nl/test/PKNULL.bmp

  • Max|Burn
  • Registratie: Augustus 2001
  • Laatst online: 26-04 09:18

Max|Burn

-- .. ... .--- .- .-.-.-

auw @ structuur :) Sla even een boekje open over ERD's / Relationele Databases.
Sorry dat ik even geen tips geef; Ik zou zelf nooit op deze manier een db bouwen.
Naja ok..

tabel klant
tabel produkt
tabel produkt_klant
etc..

[ Voor 103% gewijzigd door Max|Burn op 27-12-2004 13:07 ]

ma ma ma ma ma macron one


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Doe eens rechtermuisknop op de tabel --> generate SQL Script en post dat script hier.

Oops! Google Chrome could not find www.rijks%20museum.nl


  • sopsop
  • Registratie: Januari 2002
  • Laatst online: 19:12

sopsop

[v] [;,,;] [v]

idd MaxBurn.
Je gaat mij niet vertellen dat al die velden 100 lang moeten zijn. De gecombineerde sleutel zie ik ook niet echt in.

Als ik een suggestie mag doen: pak gewoon een identity veld als PK en zet een constraint op klantnaam en productnaam. Al zie ik nog steeds niet waarom die combinatie per definitie uniek zou moeten zijn.

=edit= en idd, normaliseren zou ook geen overbodige luxe zijn.

[ Voor 9% gewijzigd door sopsop op 27-12-2004 13:09 ]


Verwijderd

Topicstarter
P_de_B schreef op maandag 27 december 2004 @ 13:07:
Doe eens rechtermuisknop op de tabel --> generate SQL Script en post dat script hier.
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Hardwaregegevens]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[Hardwaregegevens]
GO

CREATE TABLE [dbo].[Hardwaregegevens] (
[klantnaam] [nvarchar] (100) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ,
[productsoort] [nvarchar] (100) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
[productnaam] [nvarchar] (100) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ,
[productmerk] [nvarchar] (100) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
[producttype] [nvarchar] (100) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
[serienummer] [nvarchar] (100) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
[opmerkingen] [nvarchar] (100) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
[extra1] [nvarchar] (100) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
[extra2] [nvarchar] (100) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
[extra3] [nvarchar] (100) COLLATE SQL_Latin1_General_CP1_CI_AS NULL
) ON [PRIMARY]
GO

  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 18-05 09:50

pjvandesande

GC.Collect(head);

Je PK's zijn dus ook nog is een string (VCHAR). Het is verstandig om even een stukje te lezen over databases en relaties. Moet de klantnaam en productnaam uniek zijn?

Bij mijn vorige werk waren er meerderen klanten met dezelfde naam en zelfde product. De kans is niet groot, maar het kwam bij ons al 3x voor.

offtopic:
Me ondertitel slaat niet op de TS
:+

Verwijderd

Topicstarter
boppert schreef op maandag 27 december 2004 @ 13:08:
idd MaxBurn.
Je gaat mij niet vertellen dat al die velden 100 lang moeten zijn. De gecombineerde sleutel zie ik ook niet echt in.

Als ik een suggestie mag doen: pak gewoon een identity veld als PK en zet een constraint op klantnaam en productnaam. Al zie ik nog steeds niet waarom die combinatie per definitie uniek zou moeten zijn.

=edit= en idd, normaliseren zou ook geen overbodige luxe zijn.
Productnaam is een naam die zelf toegekend wordt aan een product en per klant gedefenieerd wordt.

Verwijderd

Topicstarter
questa schreef op maandag 27 december 2004 @ 13:12:
Je PK's zijn dus ook nog is een string (VCHAR). Het is verstandig om even een stukje te lezen over databases en relaties. Moet de klantnaam en productnaam uniek zijn?

Bij mijn vorige werk waren er meerderen klanten met dezelfde naam en zelfde product. De kans is niet groot, maar het kwam bij ons al 3x voor.

offtopic:
Me ondertitel slaat niet op de TS
:+
Okey, het is misschien logischer om een bigint met een ID veld o.i.d. te gebruiken... maar dan nog zou ik graag willen weten waarom ik NULL waarden in deze velden kan plaatsen als ze not NULL zijn en daarbij ook nog eens een PK vormen.

[ Voor 5% gewijzigd door Verwijderd op 27-12-2004 13:17 ]


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Ik denk toch dat er iets vreemds aan de hand is, ik geloof niet dat SQL Server toestaan een NULL te inserten in een kolom die NOT NULL gedinieerd is. Kan het zijn dat je test op een andere tabel of database of zo?

Verder kan ik het niet anders als eens zijn met de mensen hierboven, probeer eens wat informatie over het normaliseren van databases op te zoeken, je database is niet erg uitbreidbaar op deze manier.

offtopic:
questa, het is mijn niet me

Oops! Google Chrome could not find www.rijks%20museum.nl


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

P_de_B schreef op maandag 27 december 2004 @ 13:07:
Doe eens rechtermuisknop op de tabel --> generate SQL Script en post dat script hier.
En vergeet niet 'generate constraints and indexes' aan te vinken daarbij :P

Anyway: wat een tranentrekkende structuur :X Doe eens snel die 'extra' fields in een aparte tabel zetten waar je ze linkt naar een klantID dat als identity en single-field PK in die hoofdtabel slingert en zo :X

Professionele website nodig?


Verwijderd

Topicstarter
P_de_B schreef op maandag 27 december 2004 @ 13:17:
Ik denk toch dat er iets vreemds aan de hand is, ik geloof niet dat SQL Server toestaan een NULL te inserten in een kolom die NOT NULL gedinieerd is. Kan het zijn dat je test op een andere tabel of database of zo?

Verder kan ik het niet anders als eens zijn met de mensen hierboven, probeer eens wat informatie over het normaliseren van databases op te zoeken, je database is niet erg uitbreidbaar op deze manier.

offtopic:
questa, het is mijn niet me
Ik heb het met meerdere tabellen geprobeerd en heb bij allemaal hetzelfde probleem.

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

Okee ik heb net die exacte tabel nagebouwd in SQL Server hier, en als ik niets in die PK-velden invul krijg ik netjes de correcte error dat ik in beide velden geen NULL mag stoppen :)

Professionele website nodig?


Verwijderd

Topicstarter
curry684 schreef op maandag 27 december 2004 @ 13:17:
[...]

En vergeet niet 'generate constraints and indexes' aan te vinken daarbij :P

Anyway: wat een tranentrekkende structuur :X Doe eens snel die 'extra' fields in een aparte tabel zetten waar je ze linkt naar een klantID dat als identity en single-field PK in die hoofdtabel slingert en zo :X
Die extra velden horen bij het product... Zoals je waarschijnlijk wel zult begrijpen is dit 1 tabel uit de gehele database. Klantnaam is bv gekoppeld aan een andere tabel waar weer klantgegevens instaan etc. etc.

Maar nogmaal... dat de structuur suckt is nu niet mijn probleem.

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Je moet iets fout doen, no way dat dit een bug van SQL Server is. Zit je wel in de goede database?

Oops! Google Chrome could not find www.rijks%20museum.nl


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

Ik heb deze tabel gemaakt:
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
CREATE TABLE [TestTable] (
    [klantid] [nvarchar] (100) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ,
    [meuk1] [nvarchar] (100) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
    [pk2] [nvarchar] (100) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ,
    [extra1] [nvarchar] (100) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
    CONSTRAINT [PK_TestTable] PRIMARY KEY  CLUSTERED 
    (
        [klantid],
        [pk2]
    )  ON [PRIMARY] 
) ON [PRIMARY]
GO

Deze is in principe equivalent als de jouwe, met een clustered primary key op 2 non-null velden. Daar doe ik deze query op:
SQL:
1
insert TestTable (meuk1, extra1) values ('woei', 'waa');

Wat dit resultaat geeft:
Server: Msg 515, Level 16, State 2, Line 1
Cannot insert the value NULL into column 'klantid', table 'Test.dbo.TestTable'; column does not allow nulls. INSERT fails.
The statement has been terminated.
Wat gewoon correct gedrag is. Ergo de bug die je noemt bestaat niet en je doet iets anders fout :)

Professionele website nodig?


  • sopsop
  • Registratie: Januari 2002
  • Laatst online: 19:12

sopsop

[v] [;,,;] [v]

Verwijderd schreef op maandag 27 december 2004 @ 13:22:
[...]


Die extra velden horen bij het product... Zoals je waarschijnlijk wel zult begrijpen is dit 1 tabel uit de gehele database. Klantnaam is bv gekoppeld aan een andere tabel waar weer klantgegevens instaan etc. etc.

Maar nogmaal... dat de structuur suckt is nu niet mijn probleem.
Je hebt dus een PK die tevens FK is, en dan ook nog eens een relatie op basis van een string....

Dan kan de structuur nu nog wel niet je probleem zijn, maar neem van mij aan: dat wordt het wel.

Verwijderd

Topicstarter
curry684 schreef op maandag 27 december 2004 @ 13:33:
Ik heb deze tabel gemaakt:
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
CREATE TABLE [TestTable] (
    [klantid] [nvarchar] (100) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ,
    [meuk1] [nvarchar] (100) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
    [pk2] [nvarchar] (100) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ,
    [extra1] [nvarchar] (100) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
    CONSTRAINT [PK_TestTable] PRIMARY KEY  CLUSTERED 
    (
        [klantid],
        [pk2]
    )  ON [PRIMARY] 
) ON [PRIMARY]
GO

Deze is in principe equivalent als de jouwe, met een clustered primary key op 2 non-null velden. Daar doe ik deze query op:
SQL:
1
insert TestTable (meuk1, extra1) values ('woei', 'waa');

Wat dit resultaat geeft:

[...]

Wat gewoon correct gedrag is. Ergo de bug die je noemt bestaat niet en je doet iets anders fout :)
Als ik in ASP iets schrijf naar die tabel dan komt er wel data in te staan maar toch kan de waarde van Productnaam nogsteeds NULL bevatten!
Ergo ..................

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Verwijderd schreef op maandag 27 december 2004 @ 13:44:
[...]


Als ik in ASP iets schrijf naar die tabel dan komt er wel data in te staan maar toch kan de waarde van Productnaam nogsteeds NULL bevatten!
Ergo ..................
Hier volgt een herhaling:

DIT KAN NIET IN SQL SERVER[

Je zult dus iets anders fout doen.

Oops! Google Chrome could not find www.rijks%20museum.nl


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

Verwijderd schreef op maandag 27 december 2004 @ 13:44:
[...]


Als ik in ASP iets schrijf naar die tabel dan komt er wel data in te staan maar toch kan de waarde van Productnaam nogsteeds NULL bevatten!
Ergo ..................
Doe nu eens in Query Analyzer right-click op die tabel, en dan 'Script to new window as... Create'. Paste het resultaat eens hier (daar zitten wel alle constraints in namelijk).

En probeer vervolgens eens wat handmatige INSERT's en UPDATE's op het ding los te laten middels QA, want het kan echt geen fout in SQL Server zijn dit is een probleem bij jou :)

Professionele website nodig?


  • faabman
  • Registratie: Januari 2001
  • Laatst online: 08-08-2024
Verwijderd schreef op maandag 27 december 2004 @ 13:44:
[...]


Als ik in ASP iets schrijf naar die tabel dan komt er wel data in te staan maar toch kan de waarde van Productnaam nogsteeds NULL bevatten!
Ergo ..................
ehmmm hoe geef jij die NULL op??? als een string??? dan is de waarde van het veld namelijk niet NULL maar "NULL"

edit:
ff voor de duidelijkheid, wanneer een veld de waarde NULL heeft dan ziet dat er in enterprise manager uit als

<NULL>

[ Voor 76% gewijzigd door faabman op 27-12-2004 13:59 ]

Op zoek naar een baan als Coldfusion webdeveloper? Mail me!


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

faabman schreef op maandag 27 december 2004 @ 13:53:
[...]


ehmmm hoe geef jij die NULL op??? als een string??? dan is de waarde van het veld namelijk niet NULL maar "NULL"
Uhm laat idd die ASP-code eens zien waarmee je de insert doet 8)7

Professionele website nodig?


  • EfBe
  • Registratie: Januari 2000
  • Niet online
Wellicht insert ie een "" ?

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 19-05 13:45

gorgi_19

Kruimeltjes zijn weer op :9

Ook dat is toch niet null? Dan laat hij afaik in SQL Server een lege string zien.

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • JaQ
  • Registratie: Juni 2001
  • Laatst online: 22:48

JaQ

gorgi_19 schreef op maandag 27 december 2004 @ 14:37:
[...]

Ook dat is toch niet null? Dan laat hij afaik in SQL Server een lege string zien.
Misschien dat hij daarom dus geen error krijgt?

"" != NULL

Egoist: A person of low taste, more interested in themselves than in me


  • EfBe
  • Registratie: Januari 2000
  • Niet online
gorgi_19 schreef op maandag 27 december 2004 @ 14:37:
[...]

Ook dat is toch niet null? Dan laat hij afaik in SQL Server een lege string zien.
Ja, maar sommige mensen vinden "" gelijk aan NULL bij strings. Bij strings heb je dus 2 gevallen waarin de waarde in feite 'undefined' is: "" en NULL.

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com

Pagina: 1