SQL Server에서 기본 키 열 변경
갱신하다
다음은 쿼리 결과 제약 조건입니다.
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
다음은 쿼리 결과입니다.
SELECT *
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
WHERE TABLE_NAME = 'history'
CONSTRAINT_NAME CONSTRAINT_TYPE IS_DEFERRABLE INITIALLY_DEFERRED
PK_history PRIMARY KEY NO NO
업데이트 종료
호스트는 ASP.NET Enterprise Manager를 통해 SQL Server DB에 대한 인터페이스를 제공합니다.
나는 3개의 칼럼을 가지고 있습니다.history
표:
userId
(key, int, NULL은 허용되지 않음)name
(키, 문자열, NULL은 허용되지 않음)id
(키 아님, int, NULL 허용)
나는 id 열을 유일한 키로 만들고 싶습니다.
그러기 위해서는 다음이 필요합니다.
- 해당 열의 행에 NULL이 없는지 확인합니다.
- NULL을 허용하지 않도록 열을 설정합니다.
- 열을 기본 키로 추가합니다.
- 나머지 두 열을 키로 제거합니다.
하지만 제공된 UI를 사용하면 절대 작동하지 않습니다.때로는 무언가를 시도하는 것처럼 보이지만 열 보기를 새로 고치면 변경되지 않습니다.작업 중 일부를 수행하려고 시도한 것처럼 보이지만 변경하려는 원래 테이블은 복사/덮어쓰지 않는 템플릿 테이블이 생성되는 경우가 있습니다.
쿼리를 사용하려고 하면 변경 내용도 표시되지 않습니다.다음은 제가 필요로 하는 질문입니다.
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
NULL을 허용하지 않고 ID 열에 대한 기본 키를 추가하려고 시도했을 뿐입니다.효과가 없는 것 같습니다.누가 저를 올바른 방향으로 안내해 주실 수 있나요?감사합니다!
현재 기본 키 제약 조건을 pk_history라고 가정하면 다음 행을 바꿀 수 있습니다.
ALTER TABLE history ADD PRIMARY KEY (id)
ALTER TABLE history
DROP CONSTRAINT userId
DROP CONSTRAINT name
다음을 사용합니다.
ALTER TABLE history DROP CONSTRAINT pk_history
ALTER TABLE history ADD CONSTRAINT pk_history PRIMARY KEY (id)
PK의 이름을 모르는 경우 다음 쿼리를 사용하여 PK를 찾을 수 있습니다.
SELECT *
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
WHERE TABLE_NAME = 'history'
네크로맨싱.
당신도 나만큼 같이 일하기 좋은 스키마를 가지고 있는 것 같군요.올바른 방법은 다음과 같습니다.
이 예에서 테이블 이름은 dbo입니다.T_SYS_언어_양식이며 열 이름은 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
언급URL : https://stackoverflow.com/questions/8844324/change-primary-key-column-in-sql-server
'source' 카테고리의 다른 글
유성에서 예제를 실행해야 하는 문제 (0) | 2023.06.20 |
---|---|
JDBC가 빈 결과 집합을 반환합니다. (0) | 2023.06.20 |
Oracle의 열에 시퀀스가 있는지 확인합니다. (0) | 2023.06.15 |
Google Firestore - 여러 ID로 여러 문서를 한 번의 왕복으로 가져오는 방법 (0) | 2023.06.15 |
스위치 대/소문자: 오류: 대/소문자 레이블이 정수 상수로 줄어들지 않음 (0) | 2023.06.15 |