sql-server - SQL सर्वर में किसी मौजूदा तालिका में डिफ़ॉल्ट मान वाले कॉलम जोड़ें




sql-server-2005 sql-server-2000 (25)

ALTER TABLE Protocols
ADD ProtocolTypeID int NOT NULL DEFAULT(1)
GO

DEFAULT को शामिल करने से मौजूदा पंक्तियों में कॉलम को डिफ़ॉल्ट मान के साथ भर दिया जाता है, इसलिए नल की बाधा का उल्लंघन नहीं किया जाता है।

SQL सर्वर 2000 / SQL Server 2005 में किसी मौजूदा तालिका में डिफ़ॉल्ट मान वाले कॉलम को कैसे जोड़ा जा सकता है?


सावधान रहें जब आप जो कॉलम जोड़ रहे हैं वह पूरी तरह से बाधा NOT NULL , फिर भी एक निश्चित बाधा (मान) नहीं है। अगर तालिका में कोई पंक्ति है तो ALTER TABLE विवरण उस स्थिति में विफल हो जाएगा। समाधान या तो नए कॉलम से NOT NULL नलिका को हटा देना है, या इसके लिए एक निश्चित बाधा प्रदान करना है।


एक शून्य कॉलम जोड़ते समय, WITH VALUES यह सुनिश्चित होगा कि मौजूदा पंक्तियों पर विशिष्ट DEFAULT मान लागू किया गया हो:

ALTER TABLE table
ADD column BIT     -- Demonstration with NULL-able column added
CONSTRAINT Constraint_name DEFAULT 0 WITH VALUES

IF NOT EXISTS (
    SELECT * FROM INFORMATION_SCHEMA.COLUMNS
    WHERE TABLE_NAME ='TABLENAME' AND COLUMN_NAME = 'COLUMNNAME'
)
BEGIN
    ALTER TABLE TABLENAME ADD COLUMNNAME Nvarchar(MAX) Not Null default
END

ALTER TABLE tbl_table ADD int_column int NOT NULL DEFAULT(0)

इस क्वेरी से आप डिफ़ॉल्ट मान 0 के साथ डेटाटाइप पूर्णांक का एक कॉलम जोड़ सकते हैं।


यह एसएसएमएस जीयूआई में भी किया जा सकता है। मैं नीचे एक डिफ़ॉल्ट तिथि दिखाता हूं लेकिन डिफ़ॉल्ट मूल्य निश्चित रूप से हो सकता है।

  1. अपनी तालिका को डिज़ाइन व्यू में रखें (ऑब्जेक्ट एक्सप्लोरर-> डिज़ाइन में तालिका पर राइट क्लिक करें)
  2. तालिका में एक कॉलम जोड़ें (या उस कॉलम पर क्लिक करें जिसे आप अपडेट करना चाहते हैं यदि यह पहले से मौजूद है)
  3. नीचे कॉलम गुणों में, नीचे दिए गए अनुसार (getdate()) या abc या 0 या डिफ़ॉल्ट मान या बाध्यकारी फ़ील्ड में जो भी मान आप चाहते हैं दर्ज करें :


इसमें बहुत सारे जवाब हैं, लेकिन मुझे इस विस्तारित विधि को जोड़ने की आवश्यकता महसूस होती है। यह बहुत लंबा लगता है, लेकिन यह बेहद उपयोगी है यदि आप एक सक्रिय डेटाबेस में लाखों पंक्तियों वाली तालिका में एक न्यूल फ़ील्ड जोड़ रहे हैं।

ALTER TABLE {schemaName}.{tableName}
    ADD {columnName} {datatype} NULL
    CONSTRAINT {constraintName} DEFAULT {DefaultValue}

UPDATE {schemaName}.{tableName}
    SET {columnName} = {DefaultValue}
    WHERE {columName} IS NULL

ALTER TABLE {schemaName}.{tableName}
    ALTER COLUMN {columnName} {datatype} NOT NULL

यह क्या करेगा, कॉलम को एक शून्य क्षेत्र के रूप में जोड़ें और डिफ़ॉल्ट मान के साथ, सभी फ़ील्ड्स को डिफ़ॉल्ट मान पर अपडेट करें (या आप अधिक सार्थक मान असाइन कर सकते हैं), और आखिरकार यह कॉलम को नल में बदल देगा।

इसका कारण यह है कि यदि आप एक बड़े पैमाने पर तालिका को अपडेट करते हैं और एक नया नल फ़ील्ड जोड़ते हैं तो उसे प्रत्येक पंक्ति में लिखना होगा और इस प्रकार संपूर्ण तालिका को लॉक कर देगा क्योंकि यह कॉलम जोड़ता है और फिर सभी मान लिखता है।

यह विधि उस सुस्त कॉलम को जोड़ती है जो अपने आप से बहुत तेज़ी से संचालित होती है, फिर शून्य स्थिति को सेट करने से पहले डेटा भरती है।

मैंने पाया है कि एक ही बयान में पूरी चीज करने से 4-8 मिनट के लिए हमारी अधिक सक्रिय टेबलों में से एक लॉक हो जाएगा और अक्सर मैंने प्रक्रिया को मार दिया है। यह विधि प्रत्येक भाग में आमतौर पर केवल कुछ सेकंड लगते हैं और न्यूनतम लॉकिंग का कारण बनता है।

इसके अतिरिक्त, यदि आपके पास अरबों पंक्तियों के क्षेत्र में एक टेबल है तो यह अपडेट को बैच करने के लायक हो सकता है:

WHILE 1=1
BEGIN
    UPDATE TOP (1000000) {schemaName}.{tableName}
        SET {columnName} = {DefaultValue}
        WHERE {columName} IS NULL

    IF @@ROWCOUNT < 1000000
        BREAK;
END

पहले नाम छात्र के साथ एक टेबल बनाएँ:

CREATE TABLE STUDENT (STUDENT_ID INT NOT NULL)

इसमें एक कॉलम जोड़ें:

ALTER TABLE STUDENT 
ADD STUDENT_NAME INT NOT NULL DEFAULT(0)

SELECT * 
FROM STUDENT

तालिका बनाई गई है और एक डिफ़ॉल्ट तालिका के साथ एक मौजूदा तालिका में एक कॉलम जोड़ा गया है।


डिफ़ॉल्ट मान के साथ मौजूदा डेटाबेस तालिका में कॉलम जोड़ने के लिए, हम इसका उपयोग कर सकते हैं:

ALTER TABLE [dbo.table_name]
    ADD [Column_Name] BIT NOT NULL
Default ( 0 )

डिफ़ॉल्ट मान के साथ मौजूदा डेटाबेस तालिका में कॉलम जोड़ने का दूसरा तरीका यहां दिया गया है।

एक डिफ़ॉल्ट मान के साथ कॉलम जोड़ने के लिए एक बहुत अधिक संपूर्ण SQL स्क्रिप्ट नीचे है, यह जांचने से पहले कि कॉलम मौजूद होने से पहले मौजूद है या नहीं, यह जांच भी शामिल है कि बाधा जांचें और यदि कोई हो तो उसे छोड़ दें। इस स्क्रिप्ट में बाधा का भी नाम है, इसलिए हमारे पास एक अच्छा नामकरण सम्मेलन हो सकता है (मुझे डीएफ_ पसंद है) और यदि एसक्यूएल हमें ऐसे नाम से बाधा नहीं देगा जिसमें यादृच्छिक रूप से जेनरेट किया गया नंबर है; तो यह भी बाधा का नाम देने में सक्षम होना अच्छा है।

-------------------------------------------------------------------------
-- Drop COLUMN
-- Name of Column: Column_EmployeeName
-- Name of Table: table_Emplyee
--------------------------------------------------------------------------
IF EXISTS (
            SELECT 1
            FROM INFORMATION_SCHEMA.COLUMNS
            WHERE TABLE_NAME = 'table_Emplyee'
              AND COLUMN_NAME = 'Column_EmployeeName'
           )
    BEGIN

        IF EXISTS ( SELECT 1
                    FROM sys.default_constraints
                    WHERE object_id = OBJECT_ID('[dbo].[DF_table_Emplyee_Column_EmployeeName]')
                      AND parent_object_id = OBJECT_ID('[dbo].[table_Emplyee]')
                  )
            BEGIN
                ------  DROP Contraint

                ALTER TABLE [dbo].[table_Emplyee] DROP CONSTRAINT [DF_table_Emplyee_Column_EmployeeName]
            PRINT '[DF_table_Emplyee_Column_EmployeeName] was dropped'
            END
     --    -----   DROP Column   -----------------------------------------------------------------
        ALTER TABLE [dbo].table_Emplyee
            DROP COLUMN Column_EmployeeName
        PRINT 'Column Column_EmployeeName in images table was dropped'
    END

--------------------------------------------------------------------------
-- ADD  COLUMN Column_EmployeeName IN table_Emplyee table
--------------------------------------------------------------------------
IF NOT EXISTS (
                SELECT 1
                FROM INFORMATION_SCHEMA.COLUMNS
                WHERE TABLE_NAME = 'table_Emplyee'
                  AND COLUMN_NAME = 'Column_EmployeeName'
               )
    BEGIN
    ----- ADD Column & Contraint
        ALTER TABLE dbo.table_Emplyee
            ADD Column_EmployeeName BIT   NOT NULL
            CONSTRAINT [DF_table_Emplyee_Column_EmployeeName]  DEFAULT (0)
        PRINT 'Column [DF_table_Emplyee_Column_EmployeeName] in table_Emplyee table was Added'
        PRINT 'Contraint [DF_table_Emplyee_Column_EmployeeName] was Added'
     END

GO

डिफ़ॉल्ट मान के साथ मौजूदा डेटाबेस तालिका में कॉलम जोड़ने के दो तरीके हैं।


उदाहरण:

ALTER TABLE tes 
ADD ssd  NUMBER   DEFAULT '0';

ALTER TABLE MYTABLE ADD MYNEWCOLUMN VARCHAR(200) DEFAULT 'SNUGGLES'

यदि आप कई कॉलम जोड़ना चाहते हैं तो आप इसे उदाहरण के लिए कर सकते हैं:

ALTER TABLE YourTable
    ADD Column1 INT NOT NULL DEFAULT 0,
        Column2 INT NOT NULL DEFAULT 1,
        Column3 VARCHAR(50) DEFAULT 'Hello'
GO

वैकल्पिक रूप से, आप स्पष्ट रूप से बाधा का नाम दिए बिना डिफ़ॉल्ट जोड़ सकते हैं:

ALTER TABLE [schema].[tablename] ADD  DEFAULT ((0)) FOR [columnname]

यदि आपको इस बाधा उत्पन्न करते समय मौजूदा डिफ़ॉल्ट बाधाओं के साथ कोई समस्या है तो उन्हें हटाया जा सकता है:

alter table [schema].[tablename] drop constraint [constraintname]

तालिका में एक नया कॉलम जोड़ें:

ALTER TABLE [table]
ADD Column1 Datatype

उदाहरण के लिए,

ALTER TABLE [test]
ADD ID Int

यदि उपयोगकर्ता इसे स्वचालित रूप से बढ़ाना चाहता है तो:

ALTER TABLE [test]
ADD ID Int IDENTITY(1,1) NOT NULL

उपयोग:

-- Add a column with a default DateTime  
-- to capture when each record is added.

ALTER TABLE myTableName  
ADD RecordAddedDate smalldatetime NULL DEFAULT(GetDate())  
GO 

--Adding Value with Default Value
ALTER TABLE TestTable
ADD ThirdCol INT NOT NULL DEFAULT(0)
GO

केवल दो पंक्तियों के साथ सबसे बुनियादी संस्करण

ALTER TABLE MyTable
ADD MyNewColumn INT NOT NULL DEFAULT 0

एसक्यूएल सर्वर 2008-आर 2 में, मैं डिज़ाइन मोड में जाता हूं - एक परीक्षण डेटाबेस में - और डिजाइनर का उपयोग करके अपने दो कॉलम जोड़ता हूं और जीयूआई के साथ सेटिंग्स बना देता हूं, और फिर कुख्यात राइट-क्लिक विकल्प " जेनरेट चेंज स्क्रिप्ट " देता है !

बैंग अप एक छोटी सी खिड़की के साथ पॉप करता है, आपने अनुमान लगाया है, ठीक से स्वरूपित गारंटी-से-कार्य परिवर्तन स्क्रिप्ट। आसान बटन हिट करें।



उदाहरण:

ALTER TABLE [Employees] ADD Seniority int not null default 0 GO

एसक्यूएल सर्वर + परिवर्तन तालिका + कॉलम + डिफ़ॉल्ट मूल्य अद्वितीय पहचानकर्ता जोड़ें ...

ALTER TABLE [TABLENAME] ADD MyNewColumn INT not null default 0 GO

खैर, अब मेरे पिछले जवाब में कुछ संशोधन है। मैंने देखा है कि उत्तर में से कोई भी जवाब IF NOT EXISTS । इसलिए मैं इसका एक नया समाधान प्रदान करने जा रहा हूं क्योंकि मुझे तालिका में बदलाव करने में कुछ समस्याएं आ रही हैं।

IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.columns WHERE table_name = 'TaskSheet' AND column_name = 'IsBilledToClient')
BEGIN
ALTER TABLE dbo.TaskSheet ADD
 IsBilledToClient bit NOT NULL DEFAULT ((1))
END
GO

यहां TaskSheet विशेष तालिका का नाम है और IsBilledToClient एक नया कॉलम है जिसे आप डालने जा रहे हैं और 1 डिफ़ॉल्ट मान। इसका मतलब है कि नए कॉलम में मौजूदा पंक्तियों का मूल्य क्या होगा, इसलिए कोई स्वचालित रूप से वहां सेट हो जाएगा। हालांकि, आप कॉलम प्रकार के संबंध में अपनी इच्छा के अनुसार बदल सकते हैं जैसे मैंने BIT उपयोग किया है, इसलिए मैंने डिफ़ॉल्ट मान 1 में डाल दिया है।

मैं उपरोक्त प्रणाली का सुझाव देता हूं, क्योंकि मुझे एक समस्या का सामना करना पड़ा है। तो समस्या क्या है? समस्या यह है कि यदि तालिका तालिका में IsBilledToClient कॉलम मौजूद है तो यदि आप नीचे दिए गए कोड के केवल भाग को निष्पादित करते हैं तो आपको SQL सर्वर क्वेरी बिल्डर में कोई त्रुटि दिखाई देगी। लेकिन अगर यह अस्तित्व में नहीं है तो पहली बार निष्पादन के दौरान कोई त्रुटि नहीं होगी।

ALTER TABLE {TABLENAME}
ADD {COLUMNNAME} {TYPE} {NULL|NOT NULL}
CONSTRAINT {CONSTRAINT_NAME} DEFAULT {DEFAULT_VALUE}
[WITH VALUES]

यदि डिफ़ॉल्ट शून्य है, तो:

  1. SQL सर्वर में, लक्षित तालिका का पेड़ खोलें
  2. राइट क्लिक करें "कॉलम" ==> New Column
  3. कॉलम नाम Select Type , Select Type , और नल को चेक करें चेकबॉक्स को चेक करें
  4. मेनू बार से, Save क्लिक Save

किया हुआ!


ALTER TABLE <table name> 
ADD <new column name> <data type> NOT NULL
GO
ALTER TABLE <table name> 
ADD CONSTRAINT <constraint name> DEFAULT <default value> FOR <new column name>
GO

sp_rename प्रयोग करें

EXEC sp_RENAME 'TableName.OldColumnName' , 'NewColumnName', 'COLUMN'

देखें: एसक्यूएल सर्वर - कॉलम नाम या टेबल नाम का नाम कैसे बदलें

प्रलेखन: sp_rename (ट्रांजैक्ट-एसक्यूएल)

आपके मामले के लिए यह होगा:

EXEC sp_RENAME 'table_name.old_name', 'new_name', 'COLUMN'

अपने मूल्यों को संलग्न करने के लिए सिंगल कोट्स का उपयोग करना याद रखें।





sql sql-server sql-server-2005 sql-server-2000