quitar - modificar columna auto_increment sql server
Cambiar columna de clave principal en SQL Server (2)
ACTUALIZAR
Estas son las restricciones 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
Aquí está 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
FINALIZAR ACTUALIZACIÓN
Mi host proporciona una interfaz para mi SQL Server DB a través de ASP.NET Enterprise Manager.
Tengo 3 columnas en mi tabla de history
:
-
userId
(clave, int, NULL no permitido) -
name
(clave, cadena, NULL no permitido) -
id
(no key, int, NULL permitido)
Quiero hacer que la columna de identificación sea la única clave.
Para hacer eso, creo que necesito:
- Asegúrese de que no haya valores NULL en esa columna para ninguna fila
- Establezca la columna para no permitir valores NULL
- Agregue la columna como clave principal
- Retire las otras 2 columnas como claves
Sin embargo, cuando uso la UI 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 aparecen. Aquí están las consultas 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
Solo he llegado al intento de rechazar NULLs y agregar la clave primaria para la columna id. No parece funcionar. ¿Alguien me puede apuntar en la dirección correcta? ¡Gracias!
Suponiendo que su restricción de clave primaria actual se llame 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 estos:
ALTER TABLE history DROP CONSTRAINT pk_history
ALTER TABLE history ADD CONSTRAINT pk_history PRIMARY KEY (id)
Si no sabe cuál es el nombre del PK, puede encontrarlo con la siguiente consulta:
SELECT *
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
WHERE TABLE_NAME = ''history''
Nigromancia
Parece que tienes un esquema tan bueno para trabajar como yo ... Aquí está 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