2009-05-28 15 views
3

Ich habe ein paar Web-Suchen und Antworten zu diesem gesehen, aber es scheint, dass sie alle Aufrufe beinhalten.Wie kann ich eine Spalte ermöglichen null oder eindeutige serielle

Wie kann ich eine Spalte so anpassen, dass sie nur NULL oder einen eindeutigen Wert zulässt?

In meinem Fall gibt es eine Tabelle mit Lagerartikeln, in denen nur die Server-Artikel eine Seriennummer haben. Der Rest ist null. Ich möchte eine Art Kontrolle gegen die Eingabe der gleichen Serien erzwingen.

Außerdem kann ich die Architektur nicht umgestalten, da ich ein neues Frontend an eine immer noch Live-Site schreibe.

+3

Welche RDBMS verwenden Sie? – Quassnoi

+0

Microsoft SQL Server (nur über Visual Studio für mich zugänglich) –

Antwort

0

Können Sie vom Frontend aus validieren? Bevor Sie Ihre Daten einfügen oder festschreiben, stellen Sie sicher, dass sie eindeutig oder NULL sind.

+0

Ich mache das, um es sauber zu halten es ist die einfachste Lösung –

+0

immer gut, Datenbankregeln an Ort und Stelle zu haben - Sie sollten sich nicht nur auf das Frontend für Daten verlassen Integrität. Gürtel + Hosenträger. – niico

6

In MySQL erlaubt eine Spalte UNIQUE, die auch nullable ist, eine beliebige Anzahl von Nullen (in allen Engines). Wenn Sie also MySQL verwenden, fügen Sie der betreffenden Spalte einfach eine UNIQUE-Einschränkung hinzu. Dieses Verhalten ist der SQL-Standard und wird auch von PostgreSQL und SQLite unterstützt (und anscheinend Oracle nur für die einspaltige UNIQUE Einschränkung, obwohl ich das nicht bestätigen kann).

Dieses SQL-Standardverhalten funktioniert jedoch nicht unbedingt für alle anderen RDBMS-Engines wie SQL Server oder DB2. Wenn Sie angeben, welche Engines Sie unterstützen müssen, können wir möglicherweise spezifischere Vorschläge anbieten.

+0

PostgreSQL unterstützt dieses Verhalten ebenfalls. –

+0

Richtig, und SQLite und Oracle auch, wie ich im ersten Abschnitt der Antwort gesagt habe - es ist das SQL-Standardverhalten, obwohl es immer "schwarze Schafe" gibt ;-). –

4

SQL Server ermöglicht Erstellen UNIQUE Indizes, die NULL Werte akzeptieren, obwohl es einen kleinen Trick dauert.

Erstellen Sie eine Ansicht, die nur nicht NULL Spalten und erstellen Sie die UNIQUE INDEX auf der Ansicht wählt:

CREATE VIEW myview 
AS 
SELECT * 
FROM mytable 
WHERE mycolumn IS NOT NULL 

CREATE UNIQUE INDEX ux_myview_mycolumn ON myview (mycolumn) 

Beachten Sie, dass Sie durchführen müssen, INSERT ‚s und UPDATE‘ s auf der Ansicht statt Tabelle .

Sie können es tun, mit einem INSTEAD OF Trigger:

CREATE TRIGGER trg_mytable_insert ON mytable 
INSTEAD OF INSERT 
AS 
BEGIN 
     INSERT 
     INTO myview 
     SELECT * 
     FROM inserted 
END 
+0

haben keinen 2k5-Server zur Hand, aber ein schneller Test auf 2k mit einer Integer-Spalte mit einem eindeutigen Index und Nullen verhindern, dass Sie einen zweiten Wert hinzufügen. z.B. 1,2, , 4,5 == GOOD/1,2, , 4,5, == NICHT ERLAUBT –

+0

Nicht mit mehreren NULL. SQL Server entspricht nicht der ANSI SQL (eingeführt nach der Implementierung von SQLServer) auf diesem: https://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=299229 –

+0

Sicher, sicher :) Aber ich erinnere mich, dass dies ist irgendwie möglich! – Quassnoi

0

Sie es stattdessen mit einem Trigger tun könnte ...

Index der Spalte, aber ohne eindeutige Einschränkung zulassen nulls -Stick einen Trigger Auf der Tabelle, dass bei INSERT und UPDATE Sie überprüfen, ob der Spaltenwert, den Sie einfügen möchten, entweder NULL ist oder nicht bereits in der Tabelle existiert

0

Ich weiß nicht, welche Datenbank Sie verwenden g, aber in Postgres können Sie einen Trigger "vor dem Einfügen oder Aktualisieren" definieren, der einen speziellen Wert zurückgeben kann, um die Einfügung abzulehnen. Sie können es verwenden, um eine Einschränkung wie diese auf Ihrer Tabelle zu erzwingen, wenn es keine native Möglichkeit dafür gibt.

0

Für welche Plattform ist das?

Für SQL Server siehe blog post, die eine Technik mit indizierten Sichten zeigt.

2

Wenn Sie MS SQL Server verwenden, können Sie einen gefilterten eindeutigen Index verwenden, um dies zu erreichen. Sehen Sie sich this forum thread für Details an.

+2

Hier ist auch ein Artikel, der den WHERE-Teil enthält: http://improvingsoftware.com/2010/03/26/creating-a-unique-constraint-that-ignores-nulls-in-sql-server/ – MattB

0

Für Sql Server 2008 ist hier eine Kopie der gefilterten Indexlösung von MattB verknüpft. Ich schreibe es hier um sicherzustellen, dass die Leute es nicht verpassen:

CREATE UNIQUE NONCLUSTERED INDEX [UniqueExceptNulls] 
ON [Customers] (SSN) 
WHERE [SSN] IS NOT NULL 
Verwandte Themen