2012-01-13 20 views
34

अद्यतनएसक्यूएल सर्वर में प्राथमिक कुंजी स्तंभ बदलें

क्वेरी

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 

अंत का परिणाम है अद्यतन

मेरा होस्ट एएसपी.NET एंटरप्राइज़ मैनेजर के माध्यम से मेरे SQL सर्वर डीबी में एक इंटरफ़ेस प्रदान करता है।

मैं अपने history तालिका में 3 कॉलम हैं:

  • userId (कुंजी, पूर्णांक, शून्य अनुमति नहीं)
  • name (कुंजी, स्ट्रिंग, शून्य अनुमति नहीं)
  • id (कुंजी नहीं, int, NULL अनुमत)

मैं आईडी कॉलम को एकमात्र कुंजी बनाना चाहता हूं।

कि ऐसा करने के लिए, मेरा मानना ​​है कि मैं की जरूरत है:

  1. यकीन है कि वहाँ किसी भी पंक्ति
  2. स्तंभ सेट की अनुमति नहीं करने के लिए NULLs
  3. एक के रूप में स्तंभ जोड़ें के लिए उस कॉलम में कोई NULLs हैं प्राथमिक कुंजी
  4. निकालें अन्य 2 चाबियाँ

हालांकि, जब मैं प्रदान की 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 

मैं केवल प्रयास करने के लिए मिल गया है NULLs अस्वीकृत करने के लिए और आईडी स्तंभ के लिए प्राथमिक कुंजी जोड़ने के लिए: यहाँ प्रश्नों मुझे लगता है कि मैं जरूरत है। यह काम नहीं लग रहा है। क्या कोई मुझे सही दिशा दिखा सकता है? धन्यवाद!

+0

क्या आपको एक त्रुटि संदेश मिलता है? –

+0

आपको बाधाओं को पहले –

+0

नहीं छोड़ना चाहिए, मुझे क्वेरी के साथ कोई त्रुटि संदेश नहीं मिला है। यूआई के साथ, मुझे आईडी कॉलम को एक कुंजी पर सेट करने से संबंधित त्रुटि मिली जब यह नल की अनुमति देता है, लेकिन नल को अस्वीकार करने का प्रयास करते समय कोई त्रुटि नहीं होती है। – ckbhodge

उत्तर

55

यह मानते हुए कि अपने वर्तमान प्राथमिक कुंजी बाधा 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) 

आप क्या का नाम पता नहीं है पीके है, आप इसे निम्न क्वेरी के साथ पा सकते हैं:

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

धन्यवाद। इन्हें आजमाएं (पीके नाम खोजने के लिए अपनी क्वेरी का उपयोग करने के बाद: "पीके_हिस्ट्री") लेकिन यूआई अभी भी मूल 2 कॉलम कुंजी के रूप में दिखा रहा है और बिना आईडी कॉलम। मुझे कोई त्रुटि संदेश नहीं मिला है। शायद यह आईडी कॉलम के कारण अभी भी नल की अनुमति दे रहा है? – ckbhodge

+1

क्या आपने यूआई में रीफ्रेश किया था? मुझे दृढ़ता से संदेह है कि वे विदेशी कुंजी हो सकते हैं, न कि पीके। आप INFORMATION_SCHEMA.KEY_COLUMN_USAGE से चयन कर सकते हैं जहां TABLE_NAME = 'history'' यह निर्धारित करने के लिए है कि तालिका में प्रत्येक कॉलम किस बाधा से जुड़ा हुआ है। –

+0

हां, यूआई को रीफ्रेश किया गया (टैब को भी बंद कर दिया गया और फिर से खोल दिया गया)। प्रश्न के शीर्ष पर उपर्युक्त क्वेरी के परिणाम अपडेट किए गए हैं। धन्यवाद! – ckbhodge

0

नेक्रोमांसिंग।
यह आप के साथ के रूप में मेरे ... यहाँ कैसे सही ढंग से यह करने के लिए है काम करने के लिए बस के रूप में अच्छा एक स्कीमा है दिखता है:

इस उदाहरण में, तालिका नाम 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 
संबंधित मुद्दे