2012-01-13 19 views
34

UPDATEZmień podstawową kolumnę klucza w SQL Server

Oto ograniczeń w wyniku zapytania

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 

Oto wynik zapytania

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

Mój komputer udostępnia interfejs do mojej bazy danych SQL Server za pośrednictwem programu ASP.NET Enterprise Manager.

mam 3 kolumny w moim history tabeli:

  • userId (key, int, NULL niedozwolone)
  • name (klucz, string, NULL niedozwolone)
  • id (nie klucz, int, NULL allowed)

Chcę, aby kolumna id była jedynym kluczem.

Aby to zrobić, wierzę muszę:

  1. Upewnij się, że nie ma wartości null w tej kolumnie dla każdego wiersza
  2. Ustaw kolumnę, aby nie pozwolić na wartości null
  3. Dodaj kolumnę jako klucz podstawowy
  4. Usunąć pozostałe 2 kolumny jako klucze

jednak kiedy używam UI pod warunkiem, że nie działa. Czasami będzie wyglądać, jakby próbował coś zrobić, ale nigdy się nie zmienia, gdy odświeżam widok kolumn. Czasami tworzy tabelę tymczasową, która wygląda tak, jakby próbowała wykonać część operacji, ale nigdy nie zostanie skopiowana/zastąpiona oryginalna tabela, którą próbuję zmienić.

Kiedy próbuję użyć zapytania, zmiany również się nie pojawiają. Oto pytania Chyba muszę:

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 

stałam tylko na próbę, aby nie pozwolić na wartości null i dodać klucz podstawowy dla kolumny id. To nie działa. Czy ktoś może wskazać mi właściwy kierunek? Dzięki!

+0

Czy pojawia się komunikat o błędzie? –

+0

powinieneś usunąć ograniczenia najpierw –

+0

nie, nie dostaję żadnych komunikatów o błędach z zapytaniem. W interfejsie użytkownika dostałem błąd związany z ustawianiem kolumny id na klucz, gdy zezwala na wartości null, ale brak błędu przy próbie wyłączenia wartości null. – ckbhodge

Odpowiedz

55

Zakładając, że Twój obecny ograniczenie klucza pierwotnego nazywa pk_history, można wymienić następujące linie:

ALTER TABLE history ADD PRIMARY KEY (id) 

ALTER TABLE history 
DROP CONSTRAINT userId 
DROP CONSTRAINT name 

z nich:

ALTER TABLE history DROP CONSTRAINT pk_history 

ALTER TABLE history ADD CONSTRAINT pk_history PRIMARY KEY (id) 

Jeśli nie wiesz jaka jest nazwa z następujących PK jest, możesz go znaleźć z następującym zapytaniem:

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

dzięki. Wypróbowałem te (po użyciu zapytania, aby znaleźć nazwę PK: "PK_history"), ale interfejs użytkownika nadal pokazuje oryginalne 2 kolumny jako klucze i kolumna id bez.i nie otrzymuję komunikat o błędzie.Być może wynika to z kolumny id nadal dopuszcza wartości null? – ckbhodge

+1

Czy zrobiłeś odświeżenie w interfejsie? Zdecydowanie podejrzewam, że mogą to być klucze obce, a nie PK. Możesz "WYBIERZ * Z INFORMATION_SCHEMA.KEY_COLUMN_USAGE GDZIE TABLE_NAME =" historia ", aby określić, z którym wiązaniem powiązana jest każda kolumna w tabeli. –

+0

Tak, odświeżyłem interfejs użytkownika (nawet zamknąłem kartę i ponownie otworzyłem). zaktualizowałem wyniki powyższej kwerendy na górze pytania.Dzięki! – ckbhodge

0

Nekromantowanie.
Wygląda masz tak dobry schemat pracy z jak ja ... Oto jak to zrobić poprawnie:

W tym przykładzie nazwa tabeli jest dbo.T_SYS_Language_Forms, a nazwa kolumny jest 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 
Powiązane problemy