2011-01-06 3 views
4

Wie kann ich eine Spalte als "" (die leere Zeichenfolge, gleich NULL in Oracle) festlegen, wenn diese Spalte ein Teil von ist ein mehrspaltiger Primärschlüssel? Dies ist die Motivation ...Oracle-Datenbank: Indexorganisierte Tabelle mit NULL-Werten (im mehrspaltigen Primärschlüssel)

CREATE TABLE entities (
    column1 VARCHAR2(10) 
, column2 VARCHAR2(10) 
, body  VARCHAR2(4000) 
, CONSTRAINT pk_entities   -- can't do this, because sometimes 
    PRIMARY KEY (column1, column2) -- col2 is the empty string (NULL). 
) ORGANIZATION INDEX ... 

Normalerweise würde ich einen „echten“ Primärschlüssel wie eine sinnlose sequenzielle ID verwenden (siehe this question) und dann eine eindeutige Einschränkung über meine Datenspalten setzen, wie so ..

.
CREATE TABLE entities (
, id  NUMBER PRIMARY KEY 
, column1 VARCHAR2(10) 
, column2 VARCHAR2(10) 
, body  VARCHAR2(4000) 
, CONSTRAINT unq_entities 
    UNIQUE (column1, column2) 
) ORGANIZATION INDEX ... 

dies ist jedoch eine große Index-organisierte Tabelle (IOT), so dass der Primärschlüssel hat auf den Datenspalte zu sein (in IOTs, die Daten der Index) oder auch ... Was soll ich machen?

Danke! ♥

Antwort

2

Leider ist dies ein "Merkmal" von Oracle. Im Gegensatz zu anderen SQL-DBMS unterstützt es den Zeichenfolgenwert der Länge Null nicht und besteht darauf, es in eine Null umzuwandeln.

Sie könnten eine andere Spalte als Flag erstellen, um die Zeichenfolge mit der Länge Null darzustellen und dann Leerzeichen anstelle der Spalte speichern. Ich denke nicht, dass es einen perfekten Workaround gibt. Es ist ein wenig überraschend, dass Oracle diese seltsame Einschränkung nicht korrigiert hat - insbesondere angesichts der enormen Verbesserungen, die sie in anderen Bereichen zur Einhaltung des SQL-Standards gemacht haben.

1

Ersetzen Sie die leere Zeichenfolge durch eine Dummy-Zeichenfolge und überprüfen Sie es später ... hängt davon ab, wie die Tabelle verwendet wird aber.

+0

Kann das nicht tun; Der Wert in 'column2' kann * anything * sein. – Anastasia

0

Warum brauchen Sie brauchen die Tabelle ein IOT zu sein? Ein UNIQUE INDEX in Spalte1, Spalte2 mit einer Heap-Tabelle wird wahrscheinlich fast so effizient für den Datenabruf sein.

IOTs (ähnlich einer Tabelle mit einem gruppierten Index) sind die Ausnahme, nicht die Norm in Oracle.

Verwandte Themen