2012-01-13 21 views
34

ACTUALIZACIÓNCambiar columna de clave principal en SQL Server

Estas son las limitaciones, como resultado de la consulta

SELECT * FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE TABLE_NAME = 'history' 

CONSTRAINT_NAME COLUMN_NAME ORDINAL_POSITION 
PK_history  userKey  1 
PK_history  name   2 

Este es el resultado de la consulta

SELECT * 
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS 
WHERE TABLE_NAME = 'history' 

CONSTRAINT_NAME CONSTRAINT_TYPE IS_DEFERRABLE INITIALLY_DEFERRED 
PK_history  PRIMARY KEY  NO    NO 

FIN ACTUALIZAR

Mi host proporciona una interfaz para mi DB de SQL Server a través de ASP.NET Enterprise Manager.

tengo 3 columnas en mi mesa history:

  • userId (clave, int NULL no permitido)
  • name (llave, cadena, NULL no permitido)
  • id (no clave, int, NULL permitido)

Quiero hacer de la columna de identificación la única clave.

Para hacer eso, creo que necesito:

  1. Asegúrese de que no hay valores nulos en la columna de cualquier fila
  2. Establecer la columna para no permitir valores NULL
  3. Añadir la columna como una primarias clave
  4. quitar las otras 2 columnas como claves

Sin embargo, cuando se utiliza la interfaz de usuario proporcionada, nunca funciona. A veces parecerá que intenta hacer algo, pero nunca cambia cuando actualizo la vista de las columnas. Ocasionalmente crea una tabla temporal que parece que intentó hacer parte de la operación, pero nunca se copia/sobrescribe la tabla original que intento cambiar.

Cuando intento usar una consulta, los cambios tampoco se muestran. Estas son las preguntas que creo que necesito:

SELECT * from history WHERE id is NULL  <---- This shows 0 results 

    ALTER TABLE history 
    ALTER COLUMN id int NOT NULL 

    ALTER TABLE history ADD PRIMARY KEY (id) 

    ALTER TABLE history 
    DROP CONSTRAINT userId 
    DROP CONSTRAINT name 
    GO 

sólo he llegado al intento de no permitir valores nulos y para agregar la clave principal para la columna id. No parece funcionar. ¿Alguien me puede apuntar en la dirección correcta? ¡Gracias!

+0

¿aparece un mensaje de error? –

+0

debe soltar las restricciones primero –

+0

no, no recibo ningún mensaje de error con la consulta. Con la interfaz de usuario, recibí el error relacionado con la configuración de la columna de Id. En una clave cuando permite valores nulos, pero no error al intentar desestimar los valores nulos. – ckbhodge

Respuesta

55

Suponiendo que su actual restricción de clave principal se llama pk_history, puede reemplazar las siguientes líneas:

ALTER TABLE history ADD PRIMARY KEY (id) 

ALTER TABLE history 
DROP CONSTRAINT userId 
DROP CONSTRAINT name 

con éstos:

ALTER TABLE history DROP CONSTRAINT pk_history 

ALTER TABLE history ADD CONSTRAINT pk_history PRIMARY KEY (id) 

Si usted no sabe cuál es el nombre de la PK es, puede encontrarlo con la siguiente consulta:

SELECT * 
    FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS 
WHERE TABLE_NAME = 'history' 
+0

gracias. Probé esto (después de usar su consulta para encontrar el nombre PK: "PK_history") pero la IU todavía muestra las 2 columnas originales como claves y la columna de identificación sin. No obtengo un mensaje de error. ¿Tal vez sea debido a que la columna de Id todavía permite valores nulos? – ckbhodge

+1

¿Hizo una actualización en la interfaz de usuario? Sospecho fuertemente que podrían ser claves externas y no PK. Puede 'SELECT * FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE TABLE_NAME = 'history'' para determinar a qué restricción está asociada cada una de las columnas de la tabla. –

+0

Sí, actualizó la interfaz de usuario (incluso cerró la pestaña y volvió a abrir). actualizó los resultados de la consulta anterior en la parte superior de la pregunta. ¡Gracias! – ckbhodge

0

Necromancing.
Parece que tiene tan buen esquema para trabajar con como yo ... aquí es cómo hacerlo correctamente:

En este ejemplo, el nombre de la tabla es dbo.T_SYS_Language_Forms, y el nombre de la columna es LANG_UID

-- First, chech if the table exists... 
IF 0 < (
    SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES 
    WHERE TABLE_TYPE = 'BASE TABLE' 
    AND TABLE_SCHEMA = 'dbo' 
    AND TABLE_NAME = 'T_SYS_Language_Forms' 
) 
BEGIN 
    -- Check for NULL values in the primary-key column 
    IF 0 = (SELECT COUNT(*) FROM T_SYS_Language_Forms WHERE LANG_UID IS NULL) 
    BEGIN 
     ALTER TABLE T_SYS_Language_Forms ALTER COLUMN LANG_UID uniqueidentifier NOT NULL 

     -- No, don't drop, FK references might already exist... 
     -- Drop PK if exists 
     -- ALTER TABLE T_SYS_Language_Forms DROP CONSTRAINT pk_constraint_name 
     --DECLARE @pkDropCommand nvarchar(1000) 
     --SET @pkDropCommand = N'ALTER TABLE T_SYS_Language_Forms DROP CONSTRAINT ' + QUOTENAME((SELECT CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS 
     --WHERE CONSTRAINT_TYPE = 'PRIMARY KEY' 
     --AND TABLE_SCHEMA = 'dbo' 
     --AND TABLE_NAME = 'T_SYS_Language_Forms' 
     ----AND CONSTRAINT_NAME = 'PK_T_SYS_Language_Forms' 
     --)) 
     ---- PRINT @pkDropCommand 
     --EXECUTE(@pkDropCommand) 

     -- Instead do 
     -- EXEC sp_rename 'dbo.T_SYS_Language_Forms.PK_T_SYS_Language_Forms1234565', 'PK_T_SYS_Language_Forms'; 


     -- Check if they keys are unique (it is very possible they might not be) 
     IF 1 >= (SELECT TOP 1 COUNT(*) AS cnt FROM T_SYS_Language_Forms GROUP BY LANG_UID ORDER BY cnt DESC) 
     BEGIN 

      -- If no Primary key for this table 
      IF 0 = 
      (
       SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS 
       WHERE CONSTRAINT_TYPE = 'PRIMARY KEY' 
       AND TABLE_SCHEMA = 'dbo' 
       AND TABLE_NAME = 'T_SYS_Language_Forms' 
       -- AND CONSTRAINT_NAME = 'PK_T_SYS_Language_Forms' 
      ) 
       ALTER TABLE T_SYS_Language_Forms ADD CONSTRAINT PK_T_SYS_Language_Forms PRIMARY KEY CLUSTERED (LANG_UID ASC) 
      ; 

      -- Adding foreign key 
      IF 0 = (SELECT COUNT(*) FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS WHERE CONSTRAINT_NAME = 'FK_T_ZO_SYS_Language_Forms_T_SYS_Language_Forms') 
       ALTER TABLE T_ZO_SYS_Language_Forms WITH NOCHECK ADD CONSTRAINT FK_T_ZO_SYS_Language_Forms_T_SYS_Language_Forms FOREIGN KEY(ZOLANG_LANG_UID) REFERENCES T_SYS_Language_Forms(LANG_UID); 
     END -- End uniqueness check 
     ELSE 
      PRINT 'FSCK, this column has duplicate keys, and can thus not be changed to primary key...' 
    END -- End NULL check 
    ELSE 
     PRINT 'FSCK, need to figure out how to update NULL value(s)...' 
END 
Cuestiones relacionadas