Wie kann ich eine "not null" Einschränkung in Oracle fallen lassen, wenn ich den Namen der Einschränkung nicht kenne?
Ich habe eine Datenbank, die eine not NULL Bedingung für ein Feld, und ich möchte diese Einschränkung entfernen. Die erschwerender Faktor ist, dass diese Einschränkung hat eine system-definierte Namen, und das constraint-name unterscheidet sich zwischen den Produktions-server, integration server, und die verschiedenen Entwickler-Datenbanken. Unsere aktuellen Prozess check-in ändern von Skripten und eine automatisierte Aufgabe führt die entsprechenden Abfragen durch sqlplus gegen die Zieldatenbank, so dass ich lieber eine Lösung, die gerade gesendet werden, direkt in sqlplus.
Auf meine eigene Datenbank, die SQL zu fallen wäre dies:
alter table MYTABLE drop constraint SYS_C0044566
Sehe ich die Einschränkung, wenn ich die Abfrage der all_constraints
anzeigen:
select * from all_constraints where table_name = 'MYTABLE'
aber ich bin mir nicht sicher, wie Sie mit den SEARCH_CONDITION
's LONG
Daten geben oder wie man am besten dynamisch löschen Sie die gesuchte Einschränkung, auch nachdem ich Ihren Namen kennen.
So, wie kann ich erstellen Sie ein Skript ändern können, lassen Sie diese Einschränkung basiert auf dem, was es ist, anstatt das, was sein name ist?
BEARBEITEN:
@Allan ' s Antwort ist gut, aber ich bin besorgt (in meinem Mangel an Oracle-know-how), kann es nicht universell wahr, dass jede Einschränkung, dass möglicherweise ein vom system generierter name zugewiesen haben es ein Weg, um entfernen Sie die Einschränkung, ohne zu wissen, seinen Namen. Ist es wahr, dass es immer einen Weg, um zu vermeiden, dass wissen ein system namens constraint-name wenn sich logisch fallenlassen dieser Einschränkung?
InformationsquelleAutor der Frage Chris Farmer | 2010-03-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
In Oracle -, not null-constraints werden automatisch erstellt, wenn not null für eine Spalte angegeben wird. Ebenso sind Sie automatisch gelöscht, wenn eine Spalte geändert wird, um null-Werte zulassen.
Klärung der überarbeiteten Frage: Diese Lösung gilt nur für Einschränkungen, erstellt für die "not null" - Spalten. Wenn Sie angeben, "Primary Key" oder eine check-Einschränkung in der Spalte definition, ohne es zu benennen, werden Sie am Ende mit einem vom system generierten Namen für die Einschränkung (und der index für den Primärschlüssel). In diesen Fällen müssten Sie wissen, den Namen fallen zu lassen. Der beste Rat, den es zu vermeiden das Szenario, indem Sie sicher, dass Sie einen Namen angeben, der für alle Einschränkungen, die andere als "not null". Wenn Sie sich in der situation, wo Sie brauchen, um drop eine dieser Einschränkungen generisch, müssen Sie wahrscheinlich zu greifen, um PL/SQL-und data-definition Tabellen.
InformationsquelleAutor der Antwort Allan
Versuchen:
InformationsquelleAutor der Antwort vasanth
Nur daran erinnern, wenn das Feld, das Sie wollen, um null-Werte zulässt, ist Teil einer primary key -, kann man nicht.
Primärschlüssel können nicht null Felder.
InformationsquelleAutor der Antwort Mary C
Entdecken alle constraints verwendet, verwenden Sie den folgenden code:
Dies ist im wesentlichen zeigt eine create-Anweisung, wie die referenzierte Tabelle aus. Durch das wissen, wie die Tabelle erstellt wurde, können Sie sehen, alle Tabellen-Integritätsregeln.
Antwort genommen von Michael McLaughlin ' s blog: http://michaelmclaughlin.info/db1/lesson-5-querying-data/lab-5-querying-data/ Aus seiner Datenbank Design ich Klasse.
InformationsquelleAutor der Antwort Guentersniden
Ich Stand vor dem gleichen problem versuchen zu bekommen, um eine benutzerdefinierte check-Einschränkung, die ich brauchte, um aktualisiert zu ermöglichen, unterschiedliche Werte. Problem ist, dass ALL_CONSTRAINTS hat nicht ein Weg, zu sagen, welche Spalte der Einschränkung(en) angewendet werden. Die Art und Weise habe ich es geschafft, es zu tun ist durch die Abfrage ALL_CONS_COLUMNS statt, dann fallen jedem von den Einschränkungen durch Ihren Namen und erstellen Sie es neu.
select constraint_name
von all_cons_columns
where table_name = [TABELLENNAME]
und column_name = [SPALTENNAME];
InformationsquelleAutor der Antwort CaduMaciel