Pregunta

Si quiero borrar todas las tablas en mi base de datos de este tipo, tendrá que hacerse cargo de la restricción de clave externa? Si no es así, ¿cómo me encargo de eso primero?

GO
IF OBJECT_ID('dbo.[Course]','U') IS NOT NULL
    DROP TABLE dbo.[Course]
GO
IF OBJECT_ID('dbo.[Student]','U') IS NOT NULL
    DROP TABLE dbo.[Student]
¿Fue útil?

Solución

No, esto no va a caer su mesa si hay teclas de hecho extranjeras que hacen referencia a ella.

Para obtener todas las relaciones de clave externa incluir su tabla, se podrían utilizar este SQL (si estás en SQL Server 2005 en adelante):

SELECT * 
FROM sys.foreign_keys
WHERE referenced_object_id = object_id('Student')

y si los hay, con esta declaración aquí, puede crear sentencias SQL para realmente terminar esas relaciones FK:

SELECT 
    'ALTER TABLE [' +  OBJECT_SCHEMA_NAME(parent_object_id) +
    '].[' + OBJECT_NAME(parent_object_id) + 
    '] DROP CONSTRAINT [' + name + ']'
FROM sys.foreign_keys
WHERE referenced_object_id = object_id('Student')

Otros consejos

En SQL Server Management Studio 2008 (R2) y más reciente, puede hacer clic derecho sobre el

  

DB -> Tareas -> generar secuencias de comandos

  • Seleccione las tablas que desea desconectar.

  • Seleccione "Guardar en la nueva ventana de consulta".

  • Haga clic en el botón Opciones avanzadas.

  • Conjunto de secuencias de comandos DROP y CREATE Script DROP.

  • Definición de secuencias de comandos claves externas a True.

  • Haga clic en Aceptar.

  • Haga clic en Siguiente -> Siguiente -.> Finalizar

  • Ver el guión y luego en Ejecutar.

Si se le cae la mesa "niño" en primer lugar, la clave externa se redujo también. Si intenta eliminar la tabla "padre" en primer lugar, obtendrá un "No se pudo quitar objeto 'a' porque se hace referencia por una restricción FOREIGN KEY." error.

Esta es otra manera de colocar todas las tablas correctamente, utilizando el procedimiento sp_MSdropconstraints. El código más corto que podría pensar en:

exec sp_MSforeachtable "declare @name nvarchar(max); set @name = parsename('?', 1); exec sp_MSdropconstraints @name";
exec sp_MSforeachtable "drop table ?";

Si se trata de SQL Server debe quitar la restricción antes de poder eliminar la tabla.

versión ligeramente más genérico de lo @mark_s publicado, esto me ayudó

SELECT 
'ALTER TABLE ' +  OBJECT_SCHEMA_NAME(k.parent_object_id) +
'.[' + OBJECT_NAME(k.parent_object_id) + 
'] DROP CONSTRAINT ' + k.name
FROM sys.foreign_keys k
WHERE referenced_object_id = object_id('your table')

basta con conectar el nombre de la tabla, y ejecutar el resultado de la misma.

Aquí hay otra manera de hacerlo eliminar todas las restricciones seguido de las tablas ellos mismos, utilizando un truco que implica la concatenación FOR XML PATH('') que permite la fusión de varias filas de entrada en una sola fila de salida. En caso de trabajar en cualquier cosa SQL 2005 y más adelante.

He dejado los comandos se ejecutan comentadas para la seguridad.

DECLARE @SQL NVARCHAR(max)
;WITH fkeys AS (
    SELECT quotename(s.name) + '.' + quotename(o.name) tablename, quotename(fk.name) constraintname 
    FROM sys.foreign_keys fk
    JOIN sys.objects o ON fk.parent_object_id = o.object_id
    JOIN sys.schemas s ON o.schema_id = s.schema_id
)
SELECT @SQL = STUFF((SELECT '; ALTER TABLE ' + tablename + ' DROP CONSTRAINT ' + constraintname
FROM fkeys
FOR XML PATH('')),1,2,'')

-- EXECUTE(@sql)

SELECT @SQL = STUFF((SELECT '; DROP TABLE ' + quotename(TABLE_SCHEMA) + '.' + quotename(TABLE_NAME) 
FROM INFORMATION_SCHEMA.TABLES 
FOR XML PATH('')),1,2,'')

-- EXECUTE(@sql)

Aquí hay un guión completo para implementar una solución:

create Procedure [dev].DeleteTablesFromSchema
(
    @schemaName varchar(500)
)
As 
begin
    declare @constraintSchemaName nvarchar(128), @constraintTableName nvarchar(128),  @constraintName nvarchar(128)
    declare @sql nvarchar(max)
    -- delete FK first
    declare cur1 cursor for
    select distinct 
    CASE WHEN t2.[object_id] is NOT NULL  THEN  s2.name ELSE s.name END as SchemaName,
    CASE WHEN t2.[object_id] is NOT NULL  THEN  t2.name ELSE t.name END as TableName,
    CASE WHEN t2.[object_id] is NOT NULL  THEN  OBJECT_NAME(d2.constraint_object_id) ELSE OBJECT_NAME(d.constraint_object_id) END as ConstraintName
    from sys.objects t 
        inner join sys.schemas s 
            on t.[schema_id] = s.[schema_id]
        left join sys.foreign_key_columns d 
            on  d.parent_object_id = t.[object_id]
        left join sys.foreign_key_columns d2 
            on  d2.referenced_object_id = t.[object_id]
        inner join sys.objects t2 
            on  d2.parent_object_id = t2.[object_id]
        inner join sys.schemas s2 
            on  t2.[schema_id] = s2.[schema_id]
    WHERE t.[type]='U' 
        AND t2.[type]='U'
        AND t.is_ms_shipped = 0 
        AND t2.is_ms_shipped = 0 
        AND s.Name=@schemaName
    open cur1
    fetch next from cur1 into @constraintSchemaName, @constraintTableName, @constraintName
    while @@fetch_status = 0
    BEGIN
        set @sql ='ALTER TABLE ' + @constraintSchemaName + '.' + @constraintTableName+' DROP CONSTRAINT '+@constraintName+';'
        exec(@sql)
        fetch next from cur1 into @constraintSchemaName, @constraintTableName, @constraintName
    END
    close cur1
    deallocate cur1

    DECLARE @tableName nvarchar(128)
    declare cur2 cursor for
    select s.Name, p.Name
    from sys.objects p
        INNER JOIN sys.schemas s ON p.[schema_id] = s.[schema_id]
    WHERE p.[type]='U' and is_ms_shipped = 0 
    AND s.Name=@schemaName
    ORDER BY s.Name, p.Name
    open cur2

    fetch next from cur2 into @schemaName,@tableName
    while @@fetch_status = 0
    begin
        set @sql ='DROP TABLE ' + @schemaName + '.' + @tableName
        exec(@sql)
        fetch next from cur2 into @schemaName,@tableName
    end

    close cur2
    deallocate cur2

end
go
Removing Referenced FOREIGN KEY Constraints
Assuming there is a parent and child table Relationship in SQL Server:

--First find the name of the Foreign Key Constraint:
  SELECT * 
  FROM sys.foreign_keys
  WHERE referenced_object_id = object_id('States')

--Then Find foreign keys referencing to dbo.Parent(States) table:
   SELECT name AS 'Foreign Key Constraint Name', 
           OBJECT_SCHEMA_NAME(parent_object_id) + '.' + OBJECT_NAME(parent_object_id) AS 'Child Table'
   FROM sys.foreign_keys 
   WHERE OBJECT_SCHEMA_NAME(referenced_object_id) = 'dbo' AND 
              OBJECT_NAME(referenced_object_id) = 'dbo.State'

 -- Drop the foreign key constraint by its name 
   ALTER TABLE dbo.cities DROP CONSTRAINT FK__cities__state__6442E2C9;

 -- You can also use the following T-SQL script to automatically find 
 --and drop all foreign key constraints referencing to the specified parent 
 -- table:

 BEGIN

DECLARE @stmt VARCHAR(300);

-- Cursor to generate ALTER TABLE DROP CONSTRAINT statements  
 DECLARE cur CURSOR FOR
 SELECT 'ALTER TABLE ' + OBJECT_SCHEMA_NAME(parent_object_id) + '.' + 
 OBJECT_NAME(parent_object_id) +
                ' DROP CONSTRAINT ' + name
 FROM sys.foreign_keys 
 WHERE OBJECT_SCHEMA_NAME(referenced_object_id) = 'dbo' AND 
            OBJECT_NAME(referenced_object_id) = 'states';

 OPEN cur;
 FETCH cur INTO @stmt;

 -- Drop each found foreign key constraint 
  WHILE @@FETCH_STATUS = 0
  BEGIN
    EXEC (@stmt);
    FETCH cur INTO @stmt;
  END

  CLOSE cur;
  DEALLOCATE cur;

  END
  GO

--Now you can drop the parent table:

 DROP TABLE states;
--# Command(s) completed successfully.

Con el Administrador de SQL Server se puede eliminar restricciones de clave externa de la interfaz de usuario. Si se desee eliminar el Diary mesa, pero la mesa usuario tiene una clave externa DiaryId señala la tabla Diary, se puede ampliar (usando el símbolo más) User la tabla a continuación, expanda la sección Foreign Keys. Haga clic derecho en la clave externa que apunta a la tabla a continuación, seleccione el diario Delete. A continuación, puede ampliar la sección Columns, haga clic derecho y eliminar la columna DiaryId también. A continuación, sólo se puede ejecutar:

drop table Diary

Sé tu pregunta real es acerca de cómo eliminar todas las tablas, por lo que este no puede ser un útil para ese caso. Sin embargo, si lo que desea es eliminar algunas mesas que esto es útil Creo que (el título no menciona explícitamente la eliminación de todas las tablas).

Si usted está en un servidor MySQL y si no le importa perder sus tablas, puede utilizar una consulta sencilla de eliminar varias mesas a la vez:

SET foreign_key_checks = 0;
DROP TABLE IF EXISTS table_a,table_b,table_c,table_etc;
SET foreign_key_checks = 1;

De este modo, no importa en qué orden se utiliza en la tabla se consulta.

Si alguien va a decir algo sobre el hecho de que esto no es una buena solución si usted tiene una base de datos con muchas mesas: Estoy de acuerdo

  

Si quiero borrar todas las tablas en   mi base de datos

Entonces es mucho más fácil dejar caer toda la base de datos:

DROP DATABASE WorkerPensions

Si desea DROP una mesa que ha sido referenciado por otra tabla mediante el uso de clave externa

DROP TABLE *table_name* CASCADE CONSTRAINTS;
Creo que debería funcionar para usted.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top