2016-06-01 10 views
1

Ich habe ein seltsames Problem mit einer Tabelle, ich füge Zeilen in Tabellen ein, und jetzt versuche ich es zu testen, bei einem meiner Tests erlaubt es einen Eintrag, den es nicht tun sollte.Warum kann ich eine Nummer in eine VARCHAR2-Spalte einfügen?

Meine Tabellendefinition:

CREATE TABLE ITEMS(
ITEM_NUMBER VARCHAR2(3) 
CONSTRAINT ITEMS_ITEM_NUMBERf_PK PRIMARY KEY, 
ITEM_DESCRIPTION VARCHAR2(30), 
ITEM_SIZE VARCHAR2(2), 
ITEM_COST NUMBER(30,0), 
ITEM_QTY NUMBER(2,0), 
ORDER_NUMBER VARCHAR2(4)); 

Wenn ich versuche, und testen Sie die ITEM_SIZE Spalte in einem number setzen sie es nur einfügt.

INSERT INTO ITEMS VALUES ('I32', 'Leather blazer', 'L', 14.00, 1, 'O114'); 
INSERT INTO ITEMS VALUES ('I33', 'Fleece vest', 'L', 28.00, 1, 'O128'); 
INSERT INTO ITEMS VALUES ('I34', 'Khaki pants', 'S', 22.00, 3, 'O122'); 
INSERT INTO ITEMS VALUES ('I35', 'Muscle Tee', 'M', 12.99, 1, 'O122'); 
INSERT INTO ITEMS VALUES ('I36', 'Trench Coat', 'M', 03.00, 1, 'O133'); 
INSERT INTO ITEMS VALUES ('I37', 'Crewneck sweater', 'XL', 07.00, 1, 'O107'); 
INSERT INTO ITEMS VALUES ('I38', 'Varsity Sweater', 'M', 08.99, 1, 'O108'); 
INSERT INTO ITEMS VALUES ('I39', 'CROOK', 'M', 12.00, 1, 'O112'); 

// - der Tester - //

INSERT INTO ITEMS VALUES ('I49', 'bROOK', 10, 12.00, 1, 'O112'); 

In der Erklärung oben ich die Nummer 10 in ITEM_SIZE VARCHAR2(2) einzufügen. Wie kann ich das vermeiden?

+0

nur ein klein Sie haben ITEM_SIZEf getippt statt ITEM_SIZE (wahrscheinlich) – scaisEdge

+0

ja meine schlechten leid war von meinem Tisch vor – Will

+0

testen, aber immer noch mit der Frage – Will

Antwort

1

Oracle konvertiert implizit die Zahl 10 in die varchar2-Zeichenfolge '10'.

und hier ist eine weitere implizite Konvertierung

SELECT item_size + 1 FROM items; 

Ergebnis in Oracle 11g ist

Ich bin nicht sicher, ob dies beabsichtigt war hilfreich zu sein, wenn der Parser gebaut wurde, aber es verursacht viel Verwirrung. Oracle konvertiert jedoch implizit kein alphabetisches Zeichen in eine Zahl. Es wird scheitern.

2

Wie @kevinsky sagte, Oracle is doing implicit data conversion von Nummer zu Zeichenfolge, während Sie einfügen.

Wenn Sie die Werte einschränken möchten, die in eine Spalte gesetzt werden kann, dann können Sie hinzufügen a check constraint:

alter table items add constraint items_size_chk 
    check (item_size in ('XXS','XS','S','M','L','XL','XXL','XXXL')); 

Table ITEMS altered. 

INSERT INTO ITEMS VALUES ('I49', 'bROOK', 10, 12.00, 1, 'O112'); 

SQL Error: ORA-02290: check constraint (SCHEMA.ITEMS_SIZE_CHK) violated 
02290. 00000 - "check constraint (%s.%s) violated" 
*Cause: The values being inserted do not satisfy the named check 

Wenn Sie verschiedene Einschränkungen möchten, können Sie die Art und Weise ändern, die Überprüfung durchgeführt wird; Zum Beispiel könnten Sie eine reguläre Ausdrucksprüfung haben, um Ziffern auszuschließen, aber beliebige Zeichen zuzulassen. In diesem Fall scheint es wahrscheinlicher, dass Sie eine Liste bestimmter Werte zulassen möchten.

Beachten Sie jedoch, dass Sie die Prüfbedingung ändern müssen, wenn eine neue gültige Größe hinzugefügt wird; und jeder dieser Größenwerte ist für jeden Gegenstand erlaubt.

Wenn die gültigen Größen aus einer anderen Tabelle stammen, können Sie stattdessen eine Fremdschlüsseleinschränkung verwenden. Wahrscheinlich möchten Sie wirklich eine Liste von Größen (oder anderen Attributen), die für jedes Element gültig sind, so dass Ihr Datenmodell möglicherweise etwas ausgearbeitet werden muss.

+0

Dank Alex du bist ein Geschenk des Himmels – Will

+0

Was Alex im letzten Absatz sagt, ist die richtige Lösung für diese Art von Problem. – mathguy

Verwandte Themen