다음

2012-01-13 2 views
34

UPDATE다음

쿼리 여기

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 

END의 결과입니다 UPDATE

내 호스트는 ASP.NET 엔터프라이즈 관리자를 통해 SQL Server DB에 대한 인터페이스를 제공합니다.

내가 내 history 테이블의 3 열이 :

  • userId
  • id (키가 아닌 (키, INT가 NULL 허용되지 않습니다)
  • name이 (키, 문자열, NULL 허용되지 않습니다) NULL 허용 INT)

나는 ID 열에 유일한 키 만들고 싶어.

  1. 하면 해당 컬럼에는 널 (NULL)이 널 (NULL)이
  2. A와 열을 추가 허용하지 열을 설정 한 행
  3. 위해가 없는지 확인 :

    그렇게하려면, 내가 필요 믿는다 내가 제공하는 UI를 사용할 때

그러나, 그것이 작동하지 키와 기본 키

  • 제거 다른 2 열입니다. 때로는 무언가를하려고하는 것처럼 보이지만 열의 뷰를 새로 고칠 때 변경되지 않는 경우가 있습니다. 때때로 일부 작업을 시도한 것처럼 보이는 임시 테이블을 만들지 만 변경되지 않는 원래 테이블을 복사하거나 덮어 쓰지 않습니다. 나는 쿼리를 사용하려고하면

    변경 사항이 하나 표시되지 않습니다. 난 단지 널 (NULL)을 허용하고 id 컬럼에 대한 기본 키를 추가하는 시도에 왔

    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 
    

    : 여기에 내가 필요하다고 생각 쿼리입니다. 그것은 작동하지 않는 것 같습니다. 누군가 올바른 방향으로 나를 가리킬 수 있습니까? 감사! 당신이 어떤 이름을 모르는 경우

    ALTER TABLE history DROP CONSTRAINT pk_history 
    
    ALTER TABLE history ADD CONSTRAINT pk_history PRIMARY KEY (id) 
    

    :이와

    ALTER TABLE history ADD PRIMARY KEY (id) 
    
    ALTER TABLE history 
    DROP CONSTRAINT userId 
    DROP CONSTRAINT name 
    

    :

  • +0

    오류 메시지가 나타 납니까? –

    +0

    먼저 제약 조건을 제거해야합니다. –

    +0

    아니요, 쿼리에 오류 메시지가 표시되지 않습니다. UI를 사용하면 null을 허용 할 때 id 열을 키로 설정하는 것과 관련된 오류가 발생하지만 null을 허용하지 않으려는 경우 오류가 발생하지 않습니다. – ckbhodge

    답변

    55

    다음과 같은 라인을 대체 할 수있는, 현재 기본 키 제약 조건이 pk_history라고 가정하면 PK는 다음 쿼리로 찾을 수 있습니다.

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

    감사합니다. (PK 이름을 찾으려면 쿼리를 사용한 후 "PK_history") 그러나 UI는 여전히 원래 2 열을 키로 표시합니다 및 ID 열 없음. 내가 오류 메시지가 나타나지 않습니다. 아마도 null을 허용하는 여전히 ID 열에 의한 것입니까? – ckbhodge

    +1

    UI에서 새로 고침을 수행 했습니까? 그들은 PK가 아닌 외래 키가 될 수 있다고 강력히 의심합니다. SELECT * FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE TABLE_NAME = 'history ''를 사용하면 테이블의 각 열과 관련된 제약 조건을 확인할 수 있습니다. –

    +0

    UI를 새로 고칩니다 (탭을 닫은 후 다시 열어도). 질문의 맨 위에서 위 쿼리의 결과를 업데이트했습니다. 감사합니다. – ckbhodge

    0

    Necromancing.
    그것은 당신이 나를 ... 여기 올바르게 수행하는 방법을 그대로 작업 할만큼 좋은 스키마가 같습니다

    이 예에서

    , 테이블 이름 dbo.T_SYS_Language_Forms이며, 열 이름입니다 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