primary - ¿Cómo puedo eliminar una restricción "no nula" en Oracle cuando no conozco el nombre de la restricción?
eliminar constraint primary key oracle (5)
Estaba enfrentando el mismo problema al tratar de evitar una restricción de verificación personalizada que necesitaba actualizar para permitir diferentes valores. El problema es que ALL_CONSTRAINTS no tiene una forma de decir a qué columna se aplican las restricciones. La forma en que lo logré es consultar ALL_CONS_COLUMNS en su lugar, luego descartar cada una de las restricciones por su nombre y volver a crearla.
seleccione constraint_name de all_cons_columns donde table_name = [TABLE_NAME] y column_name = [COLUMN_NAME];
Tengo una base de datos que tiene una restricción NOT NULL en un campo, y quiero eliminar esta restricción. El factor que complica la situación es que esta restricción tiene un nombre definido por el sistema, y ese nombre de restricción difiere entre el servidor de producción, el servidor de integración y las diversas bases de datos de desarrolladores. Nuestro proceso actual consiste en verificar las secuencias de comandos de cambio y una tarea automatizada ejecuta las consultas adecuadas a través de sqlplus en la base de datos de destino, por lo que preferiría una solución que simplemente se envíe directamente a sqlplus.
En mi propia base de datos, el SQL para soltar esto sería:
alter table MYTABLE drop constraint SYS_C0044566
Puedo ver la restricción cuando all_constraints
vista all_constraints
:
select * from all_constraints where table_name = ''MYTABLE''
pero no estoy seguro de cómo trabajar con el tipo de datos LONG
SEARCH_CONDITION
o la mejor forma de eliminar dinámicamente la restricción buscada incluso después de saber su nombre.
Entonces, ¿cómo puedo crear un script de cambio que pueda eliminar esta restricción en función de lo que sea, en lugar de cómo se llama?
EDITAR: la respuesta de @ Allan es buena, pero me preocupa (en mi falta de experiencia en Oracle) que no sea universalmente cierto que cualquier restricción que pueda tener un nombre generado por el sistema se haya asociado a una forma de eliminar el restricción sin tener que saber su nombre. ¿Es cierto que siempre habrá una forma de evitar tener que conocer el nombre de una restricción con nombre de sistema cuando se elimine lógicamente esa restricción?
Para descubrir cualquier restricción utilizada, use el siguiente código:
-- Set the long data type for display purposes to 500000.
SET LONG 500000
-- Define a session scope variable.
VARIABLE output CLOB
-- Query the table definition through the <code>DBMS_METADATA</code> package.
SELECT dbms_metadata.get_ddl(''TABLE'',''[Table Described]'') INTO :output FROM dual;
Esto esencialmente muestra una declaración de creación de cómo se realiza la tabla a la que se hace referencia. Al saber cómo se crea la tabla, puede ver todas las restricciones de la tabla.
Respuesta tomada del blog de Michael McLaughlin: http://michaelmclaughlin.info/db1/lesson-5-querying-data/lab-5-querying-data/ De su clase Database Design I.
Solo recuerde, si el campo que desea convertir en nulo es parte de una clave principal, no puede. Las claves primarias no pueden tener campos nulos.
Tratar:
alter table <your table> modify <column name> null;
alter table MYTABLE modify (MYCOLUMN null);
En Oracle, las restricciones no nulas se crean automáticamente cuando no se especifica nulo para una columna. Del mismo modo, se eliminan automáticamente cuando se cambia la columna para permitir nulos.
Aclaración de la pregunta revisada : esta solución solo se aplica a las restricciones creadas para columnas "no nulas". Si especifica "Clave principal" o una restricción de verificación en la definición de la columna sin nombrarla, terminará con un nombre generado por el sistema para la restricción (y el índice, para la clave primaria). En esos casos, necesitarías saber el nombre para soltarlo. El mejor consejo es evitar el escenario asegurándose de especificar un nombre para todas las restricciones que no sean "no nulas". Si se encuentra en la situación en la que necesita eliminar una de estas restricciones genéricamente, probablemente necesite recurrir a PL / SQL y las tablas de definición de datos.