CHECK-EINSCHRÄNKUNG der Zeichenfolge, die nur Ziffern enthalten. (Oracle-SQL)
Ich habe eine Spalte, sagen PROD_NUM, die enthält eine 'Nummer' wird Links mit Nullen aufgefüllt. Zum Beispiel 001004569. Sie sind alle neun Zeichen lang sein.
Ich nicht verwenden, die einen numerischen Typ, weil Sie den normalen Betrieb auf Nummern nicht Sinn machen, auf diese "zahlen" (Zum Beispiel PROD_NUM * 2 macht keinen Sinn.) Und da Sie alle die gleiche Länge, die Spalte ist definiert als CHAR(9)
CREATE TABLE PRODUCT (
PROD_NUM CHAR(9) NOT NULL
-- ETC.
)
Möchte ich einschränken PROD_NUM so kann es enthält nur neun stellen. Keine Leerzeichen, keine anderen Zeichen außer '0' bis '9'
+1 für Funkenbildung eine gute philosophische Diskussion 😉
+1 für die Beobachtung, dass, wenn arithmetische Operationen sind nicht sinnvoll auf die Spalte, dann sollte es nicht als Zahl gespeichert. Es war eine Reizung, die mir seit Jahren, dass die Menschen speichern eine SSN oder Telefon-Nummer oder Kunden-Konto-Nummer in einen numerischen Datentyp, und dann müssen TO_CHAR() auf, um mit ihm umgehen. Gut gemacht.
+1 für die Beobachtung, dass, wenn arithmetische Operationen sind nicht sinnvoll auf die Spalte, dann sollte es nicht als Zahl gespeichert. Es war eine Reizung, die mir seit Jahren, dass die Menschen speichern eine SSN oder Telefon-Nummer oder Kunden-Konto-Nummer in einen numerischen Datentyp, und dann müssen TO_CHAR() auf, um mit ihm umgehen. Gut gemacht.
InformationsquelleAutor Shannon Severance | 2009-07-22
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ein Satz gibt an, einen Charakter-Klasse, die zwei zeigt an einem benannten Zeichenklasse. Siehe en.wikipedia.org/wiki/...
Eine kleine Einschränkung: REGEXP_LIKE nicht nutzen Indizes wie der LIKE-operator würde. Dies ist gut für die OP ' s problem (eine INSERT - /UPDATE-Einschränkung), kann aber keine ausreichende Leistung beim suchen von Datensätzen nach der Tat.
Indizes nie verwendet, die von check-Einschränkungen sowieso.
InformationsquelleAutor Tim Sylvester
Sie bereits einige nette Antworten auf, wie Sie weiterhin auf Ihrem aktuellen Pfad. Bitte erlauben Sie mir vorschlagen, einen anderen Weg: verwenden Sie eine Zahl(9,0) Datentyp statt.
Gründe:
Brauchen Sie nicht eine zusätzliche check-constraint, um zu bestätigen, es enthält eine reelle Zahl.
Sind Sie nicht Narren, die der Optimierer. Zum Beispiel, wie viele prod_num sind "ZWISCHEN" 000000009 " und "000000010'"? Menge der Zeichenketten passen. In der Erwägung, dass "prod_num zwischen 9 und 10" natürlich wählt nur zwei zahlen. Kardinalitäten besser sein wird, was zu einer besseren Ausführung der Pläne.
Sind Sie nicht Narren künftigen Kollegen, die Sie zur Pflege Ihres code. Die Namensgebung "prod_num" werden Sie automatisch davon ausgehen, es enthält eine Zahl.
Ihrer Anwendung verwenden können, lpad(to_char(prod_num),9,'0'), vorzugsweise ausgesetzt in einer Ansicht.
Grüße,
Rob.
(update MH) Der Kommentar-thread hat sich eine Diskussion, die schön veranschaulicht die verschiedenen Dinge zu berücksichtigen, die über diesen Ansatz. Wenn dieses Thema interessant ist, Sie sollten Sie Lesen.
Sie erhöhen viele gute Punkte. Aber die Welt ist gefüllt mit "Nummern", die nicht zahlen, sondern-codes oder IDs. VINs (Vehicle Identification number) und viele Seriennummern in den Sinn kommen. Die Nutzer haben beschlossen, nennen diese Produkt-Nummern und beschlossen, die Sie wollen, dass Sie null auf der linken Seite aufgefüllt. Bei einigen Schicht der Anwendung, die ich haben eine Produkt-Reihe, dass ist ein null-string. Ich würde eher gleichmäßig den ganzen Weg um die Basis-Tabelle.
Okay, eine Letzte Bemerkung, und ich werde den Mund halten. Ich arbeite derzeit an einer Website, wo genau dieses Szenario spielte heraus. Eine zentral wichtige "Zahl" zu unserem-system begann, alle Ziffern. Sat-Systeme begann vorausgesetzt, zahlen; so wie die apps. Unser Kunde sagt, "oh, BTW, wir möchten, dass Sie Präfix Ihre "Nummern" mit zwei alpha-chars. Ratet mal, was? Jahre auf der Straße und wir fühlen immer noch den Schmerz. IMMER SCHAUEN DIE STRAßE HINUNTER. BETRACHTEN SIE DIE SCHLIMMSTEN FALL. Nicht davon ausgehen, dass, weil die Dinge sehen wie die zahlen heute sind, Sie müssen immer zahlen sein. Externalitäten zählen!
Okay, bitte gestatten Sie eine Letzte Bemerkung von mir als gut. Es ist meine überzeugung, dass man, um wählen Sie den Datentyp, constraints der Daten gerade Recht. Nur weil es nicht mathematisch manipuliert werden, bedeutet nicht, es ist keine Zahl. Ich werde nicht zu berechnen, mit meinem Ersatzschlüssel zahlen, nicht mit meinem Telefon-Nummern, und nicht mit meinem Tour de France-Fahrer zahlen. Ich halte Ihnen zahlen, denn das Zwänge Sie richtig. Ich werde nie die Beratung, deklarieren, solche Spalten VARCHAR2(N) (4000?) oder sogar ein CLOB, um vorbereitet zu sein für alles, was passieren könnte. Ich benutze eine view-Schicht.
Zweck meiner Antwort ist einfach bewusst machen, mögliche Fallstricke bei der Wahl des CHAR(9) Ansatz." Und ich danke Ihnen dafür. Ich wollte zeigen, dass ich hatte, als die Probleme, die Sie ausgelöst. Und ich mochte das Antwort genug zu Abstimmung.
InformationsquelleAutor Rob van Wijk
Funktioniert in allen Versionen:
InformationsquelleAutor David Aldridge
Ich denke Codebender die regexp funktionieren, aber ich vermute, es ist ein bisschen langsam.
Können Sie tun (ungetestet)
ersetzen(übersetzen(prod_num,'0123456789','NNNNNNNNNN'),'N',null) null ist
TRANSLATE( prod_num, 'A0123456789','A') IS NULL
.InformationsquelleAutor Theo
Casten auf integer, warf es wieder auf varchar, und überprüfen Sie entspricht der original-string?
Ah, guter Punkt.
InformationsquelleAutor Joel Coehoorn
In MSSQL, die ich verwenden könnte, so etwas wie die Einschränkung testen:
Ich bin kein Oracle Mensch, aber ich glaube nicht, dass Sie Unterstützung in Klammern, Charakter-Listen.
Nun, es ist regexp_like.
InformationsquelleAutor richardtallent
in MS SQL server verwende ich diesen Befehl:
alter table-add constraint [cc_mytable_myfield] check (cast(myfield als bigint -) > 0)
InformationsquelleAutor danny
Nicht sicher über die Leistung, aber wenn Sie wissen, den Bereich, die folgenden arbeiten.
Verwendet eine CHECK-Einschränkung, die zum Zeitpunkt der Erstellung der DDL.
als
dies funktioniert auch,
InformationsquelleAutor blispr