source

SQL Server에서 기본 키 열 변경

manycodes 2023. 6. 20. 21:42
반응형

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 열을 유일한 키로 만들고 싶습니다.

그러기 위해서는 다음이 필요합니다.

  1. 해당 열의 행에 NULL이 없는지 확인합니다.
  2. NULL을 허용하지 않도록 열을 설정합니다.
  3. 열을 기본 키로 추가합니다.
  4. 나머지 두 열을 키로 제거합니다.

하지만 제공된 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

반응형