এসকিউএল সার্ভারে সনাক্তকরণ কলাম কীভাবে আপডেট করবেন?


195

আমার এসকিউএল সার্ভার ডাটাবেস রয়েছে এবং আমি পরিচয় কলামটি পরিবর্তন করতে চাই কারণ এটি একটি বড় সংখ্যা দিয়ে শুরু হয়েছিল 10010এবং এটি অন্য টেবিলের সাথে সম্পর্কিত, এখন আমার 200 টি রেকর্ড রয়েছে এবং রেকর্ডগুলি বাড়ার আগে আমি এই সমস্যাটি ঠিক করতে চাই।

এই কলামটি পরিবর্তন বা পুনরায় সেট করার সর্বোত্তম উপায় কী?

উত্তর:


269

আপনি পরিচয় কলাম আপডেট করতে পারবেন না।

এসকিউএল সার্ভার আপডেট স্টেটমেন্ট সহ অন্যান্য কলামগুলির সাথে আপনি যা করতে পারেন তার বিপরীতে পরিচয় কলামটি আপডেট করার অনুমতি দেয় না।

যদিও একই ধরণের প্রয়োজনীয়তা অর্জনের জন্য কিছু বিকল্প রয়েছে।

  • যখন নতুন রেকর্ডের জন্য পরিচয় কলাম মান আপডেট করা দরকার

ডিবিসিসি CHECKIDENT ব্যবহার করুন যা সারণীর জন্য বর্তমান পরিচয় মান পরীক্ষা করে এবং এটির প্রয়োজন হলে পরিচয় মান পরিবর্তন করে।

DBCC CHECKIDENT('tableName', RESEED, NEW_RESEED_VALUE)
  • যখন বিদ্যমান রেকর্ডগুলির জন্য পরিচয় কলাম মান আপডেট করা দরকার

IDENTITY_INSERT ব্যবহার করুন যা সারণীর পরিচয় কলামে সুস্পষ্ট মানগুলিকে সন্নিবেশ করতে দেয়।

SET IDENTITY_INSERT YourTable {ON|OFF}

উদাহরণ:

-- Set Identity insert on so that value can be inserted into this column
SET IDENTITY_INSERT YourTable ON
GO
-- Insert the record which you want to update with new value in the identity column
INSERT INTO YourTable(IdentityCol, otherCol) VALUES(13,'myValue')
GO
-- Delete the old row of which you have inserted a copy (above) (make sure about FK's)
DELETE FROM YourTable WHERE ID=3
GO
--Now set the idenetity_insert OFF to back to the previous track
SET IDENTITY_INSERT YourTable OFF

6
ডিবিসিসি পরবর্তী নতুন রেকর্ডটি পুনরায় সেট করুন, তবে আমি এখন বিদ্যমান রেকর্ডগুলি পরিবর্তন করতে চাই।
আবদুলসালাম এলশারিফ

আপনি দয়া করে উদাহরণ দিতে পারেন?
আবদুলসালাম এলশারিফ

38
@ সাচিন এটি ম্যানুয়ালি সন্নিবেশ করছে এমন কোনও বিদ্যমান পরিচয় আপডেট করছে না
ফিল গ্রেগগান

3
@ ফিলগ্রেগগান হ্যাঁ, এটি অর্জনের এটি সর্বোত্তম সম্ভাব্য সমাধান। আপনি সাধারণগুলি আপডেট করার সাথে সাথে আপনি পরিচয় কলাম আপডেট করতে পারবেন না।
শচীন

17
এই গৃহীত উত্তরটি প্রশ্নের উত্তর দেয় না, এটি কীভাবে কোনও পরিচয় কলাম আপডেট করা যায় (উদাঃ UPDATE YourTable SET IdentityCol = 13)। SET IDENTITY_INSERT YourTable ONশুধুমাত্র INSERTs এর অনুমতি দেয়, আপডেট নয়।
ইয়ান বয়ড 21

61

যদি আপনার প্রশ্নটি ঠিক থাকে তবে আপনি এরকম কিছু করতে চান

update table
set identity_column_name = some value

আমি আপনাকে বলি, এটি কোনও সহজ প্রক্রিয়া নয় এবং এটি ব্যবহার করার পরামর্শ দেওয়া হয় না, কারণ এর সাথে কিছু foreign keyযুক্ত থাকতে পারে ।

তবে এখানে এটি করার পদক্ষেপ রয়েছে, দয়া করে একটি back-upটেবিল নিন

পদক্ষেপ 1- সারণীর নকশা ভিউ নির্বাচন করুন

এখানে চিত্র বর্ণনা লিখুন

পদক্ষেপ 2- পরিচয় কলামটি বন্ধ করুন

এখানে চিত্র বর্ণনা লিখুন

এখন আপনি updateকোয়েরিটি ব্যবহার করতে পারেন ।

এখন redoপদক্ষেপ 1 এবং 2 পদক্ষেপ এবং পরিচয় কলামটি চালু করুন

উল্লেখ


1
এই টেবিলের সাথে আমার আরও একটি সারণী আছে, আমি এটি করতে পারি না
আবদুলসালাম এলশারিফ

4
সুতরাং বিবৃতি এটি পরামর্শ দেওয়া হয় না :)
Luv

3
@ আবদুসালাম এলশেফরিফ কিন্তু আপনি কীভাবে পরিচয় কলাম পরিবর্তন করবেন জিজ্ঞাসা করেছেন।
পাপারাজ্জো

@ ল্যু কমপক্ষে আপনি যে প্রশ্নটি জিজ্ঞাসা করেছেন তার উত্তর দিয়েছেন
ফিল গ্রেগগান

আমি আমার বিকাশ ডাটাবেসে আইডি সেট করার জন্য এই পদ্ধতিটি ব্যবহার করি। এটি যদি এমন কোনও আদেশ থাকে যা আমাকে যেভাবেই এটি করতে দেয়, তবে এটি কার্যকর হবে।
জেফ ডেভিস

56

তোমার দরকার

set identity_insert YourTable ON

তারপরে আপনার সারিটি মুছুন এবং এটিকে আলাদা পরিচয় দিয়ে আবার সন্নিবেশ করুন।

একবার আপনি সন্নিবেশটি সম্পন্ন করার পরে পরিচয়_ইনসেটটি বন্ধ করতে ভুলবেন না

set identity_insert YourTable OFF

এটি কলামটির জন্য পরিচয় বন্ধ করার চেয়ে অনেক সহজ এবং নিরাপদ!
রক্ষক এক

এটি নিরাপদ এবং অল্প সংখ্যক রেকর্ডের জন্য সহজ, তবে সঠিকভাবে প্রশ্নের উত্তর দেয় না। পরিচয় বন্ধ করা, যদিও এটি আরও বিপজ্জনক এবং কখনও কখনও অসম্ভব, তবুও আপনাকে পরিচয় কলাম আপডেট করার অনুমতি দেয়।
ম্যাথু হাডসন

18
--before running this make sure Foreign key constraints have been removed that reference the ID. 

--set table to allow identity to be inserted
SET IDENTITY_INSERT yourTable ON;
GO
--insert everything into a temp table
SELECT * 
INTO #tmpYourTable
FROM yourTable

--clear your table
DELETE FROM yourTable
--insert back all the values with the updated ID column
INSERT INTO yourTable (IDCol, OtherCols)
SELECT ID+1 as updatedID --put any other update logic to the ID here
, OtherCols FROM #tmpYourTable
--drop the temp table
DROP TABLE #tmpYourTable
--put identity back to normal
SET IDENTITY_INSERT yourTable OFF;
GO

1
টেবিলটি খুব বড় হলে কেবলমাত্র পারফরম্যান্সের একটি পরামর্শ, টেবিলে মুছে ফেলার পরিবর্তে আপনার টেবিলটি একটি কাটা টেবিলটি করুন। এটি তাত্ক্ষণিক। যদিও সাবধানতা অবলম্বন করা হয়নি, এটি লগড না হওয়ার কারণে কাটা কাটা পিছনে ফিরে আর ফিরে আসবে না।
kuklei


5

পরিচয় কলাম ছাড়াই আপনার টেবিলটিকে একটি নতুন টেবিলে অনুলিপি করুন।

    select columns into newtable from yourtable

নতুন বীজের সাথে নতুন টেবিলে একটি পরিচয় কলাম যুক্ত করুন এবং এটিকে একটি প্রাথমিক কী হিসাবে তৈরি করুন

    ALTER TABLE tableName ADD id MEDIUMINT NOT NULL AUTO_INCREMENT KEY

3
DBCC CHECKIDENT(table_name, RESEED, value)

টেবিলের নাম = আপনি যে মান সারণি করতে চান তা দিতে পারেন

মান = প্রাথমিক মান শূন্য হতে, 1 দিয়ে পরিচয় কলাম শুরু করতে


3
SET IDENTITY_INSERT dbo.TableName ON
INSERT INTO dbo.TableName 
(
    TableId, ColumnName1, ColumnName2, ColumnName3
)
VALUES
(
    TableId_Value, ColumnName1_Value, ColumnName2_Value, ColumnName3_Value
)

SET IDENTITY_INSERT dbo.TableName OFF

আইডেন্টিটি_ইনসেট ব্যবহার করার সময় কলামের নামগুলি অন্তর্ভুক্ত করতে ভুলবেন না কারণ sql আপনাকে সেগুলি উল্লেখ না করে সন্নিবেশ করতে দেয় না


2

আপনি SET IDENTITY INSERTপরিচয় কলামে মান সন্নিবেশ করার অনুমতি দিতে আপনি ব্যবহার করতে পারেন ।

উদাহরণ:

SET IDENTITY_INSERT dbo.Tool ON
GO

এবং তারপরে আপনি আপনার প্রয়োজনীয় মানগুলি একটি পরিচয় কলামে সন্নিবেশ করতে পারেন।


1
ALTER TABLE tablename add newcolumn int
update tablename set newcolumn=existingcolumnname
ALTER TABLE tablename DROP COLUMN existingcolumnname;
EXEC sp_RENAME 'tablename.oldcolumn' , 'newcolumnname', 'COLUMN'
update tablename set newcolumnname=value where condition

তবে উপরের কোডটি কেবল তখনই কাজ করে যদি কোনও প্রাথমিক-বিদেশী কী সম্পর্ক থাকে


1

কমান্ড নির্মাতা ব্যবহার করে সি # প্রোগ্রামারদের সম্পূর্ণ সমাধান

প্রথমত, আপনাকে এই তথ্যগুলি জানতে হবে:

  • যে কোনও ক্ষেত্রে, আপনি একটি পরিচয় কলাম পরিবর্তন করতে পারবেন না, সুতরাং আপনাকে সারিটি মুছতে হবে এবং নতুন পরিচয় দিয়ে পুনরায় যুক্ত করতে হবে।
  • আপনি কলাম থেকে পরিচয় সম্পত্তিটি সরাতে পারবেন না (আপনাকে কলামে সরিয়ে ফেলতে হবে)
  • । নেট থেকে কাস্টম কমান্ড নির্মাতা সর্বদা পরিচয় কলামটি এড়িয়ে যায়, তাই আপনি এই উদ্দেশ্যে এটি ব্যবহার করতে পারবেন না।

সুতরাং, একবার যে জেনে, আপনি কি করতে হবে। হয় প্রোগ্রামটি আপনার নিজের এসকিউএল সন্নিবেশ বিবৃতি, বা আপনার নিজেরাই সন্নিবেশ কমান্ড বিল্ডারের প্রোগ্রাম। বা আপনার জন্য আমি প্রোগ্রাম করে রেখেছি এমনটি ব্যবহার করুন। একটি ডেটা টেবিল দেওয়া হয়েছে, এসকিউএল সন্নিবেশ স্ক্রিপ্ট উত্পন্ন করে:

public static string BuildInsertSQLText ( DataTable table )
{
    StringBuilder sql = new StringBuilder(1000,5000000);
    StringBuilder values = new StringBuilder ( "VALUES (" );
    bool bFirst = true;
    bool bIdentity = false;
    string identityType = null;

    foreach(DataRow myRow in table.Rows) 
    {
        sql.Append( "\r\nINSERT INTO " + table.TableName + " (" );

        foreach ( DataColumn column in table.Columns )
        {
            if ( column.AutoIncrement )
            {
                bIdentity = true;

                switch ( column.DataType.Name )
                {
                    case "Int16":
                        identityType = "smallint";
                        break;
                    case "SByte":
                        identityType = "tinyint";
                        break;
                    case "Int64":
                        identityType = "bigint";
                        break;
                    case "Decimal":
                        identityType = "decimal";
                        break;
                    default:
                        identityType = "int";
                        break;
                }
            }
            else
            {
                if ( bFirst )
                    bFirst = false;
                else
                {
                    sql.Append ( ", " );
                    values.Append ( ", " );
                }
                sql.Append ("[");
                sql.Append ( column.ColumnName );
                sql.Append ("]");

                //values.Append (myRow[column.ColumnName].ToString() );

                if (myRow[column.ColumnName].ToString() == "True")
                    values.Append("1");
                else if (myRow[column.ColumnName].ToString() == "False")
                    values.Append("0");
                else if(myRow[column.ColumnName] == System.DBNull.Value)    
                    values.Append ("NULL");
                else if(column.DataType.ToString().Equals("System.String"))
                {
                    values.Append("'"+myRow[column.ColumnName].ToString()+"'");
                }
                else
                    values.Append (myRow[column.ColumnName].ToString());
                    //values.Append (column.DataType.ToString() );
            }
        }
        sql.Append ( ") " );
        sql.Append ( values.ToString () );
        sql.Append ( ")" );

        if ( bIdentity )
        {
            sql.Append ( "; SELECT CAST(scope_identity() AS " );
            sql.Append ( identityType );
            sql.Append ( ")" );
        }
        bFirst = true;
        sql.Append(";");
        values = new StringBuilder ( "VALUES (" );
    } //fin foreach
    return sql.ToString ();
}

0

আমি প্রথমে ডিবিসিসি ব্যবহার করে এবং তারপরে সন্নিবেশ ব্যবহার করে এই সমস্যার সমাধান করেছি। উদাহরণস্বরূপ যদি আপনার টেবিলটি থাকে

প্রথমত টেবিলে নতুন বর্তমান আইডি মানটি NEW_RESEED_VALUE হিসাবে সেট করুন

মাই টেবিল {আইডি কল, কোলা, কলবি}

    DBCC CHECKIDENT('MyTable', RESEED, NEW_RESEED_VALUE)

তাহলে আপনি ব্যবহার করতে পারেন

    insert into MyTable (colA, ColB) select colA, colB from MyTable

এটি আপনার সমস্ত রেকর্ডকে সদৃশ করবে তবে নতুন আইডকল মান ব্যবহার করে NEW_RESEED_VALUE হিসাবে শুরু হবে। এরপরে আপনি তাদের বিদেশী কী রেফারেন্সগুলি মুছে ফেলা / সরানোর পরে একবারে উচ্চ আইডি মান সদৃশ সারিগুলি সরিয়ে ফেলতে পারেন any


1
এটি একটি শালীন ধারণা, তবে নিউ_রসিড_মূল্যটি বর্তমান বীজ এবং পরবর্তী সংখ্যাটি ব্যবহার করা হবে সেই মানটির চেয়ে 1 টি বেশি। তাই আপনি যদি পরবর্তী ঢোকানো সারি পরিচয় 10 হতে চান, তাহলে NEW_RESEED_VALUE 9. সেট থাকা উচিত
LarryBud

0

আপনি নিম্নলিখিত কোডটি ব্যবহার করে একটি নতুন টেবিল তৈরি করতে পারেন।

SELECT IDENTITY (int, 1, 1) AS id, column1, column2
INTO dbo.NewTable
FROM dbo.OldTable

তারপরে পুরানো ডিবি মুছুন এবং নতুন ডিবিটির নাম পুরানো ডিবি-র নাম দিন। দ্রষ্টব্য : সেই কলাম 1 এবং কলাম 2 আপনার পুরানো টেবিলের সমস্ত কলামগুলি উপস্থাপন করে যা আপনি আপনার নতুন সারণীতে রাখতে চান।


0

আপনার যদি বিশেষত প্রাথমিক কী মানটি আলাদা সংখ্যায় (প্রাক্তন 123 -> 1123) পরিবর্তন করতে হয়। পরিচয়ের বৈশিষ্ট্য একটি পিকে মান পরিবর্তন করে blocks পরিচয় সেট করুন_সাইন্ট কাজ করছে না। আপনার যদি ক্যাসকেডিং মোছা থাকে (যদি আপনি রেফারেন্সিয়াল অখণ্ডতা পরীক্ষা বন্ধ না করেন) সন্নিবেশ / মুছুন এমনটি করা ঠিক নয়।

এই স্ক্রিপ্টটি কোনও পিকে পরিচয় বন্ধ করবে:

***********************

sp_configure 'allow update', 1
go
reconfigure with override
go


update syscolumns set colstat = 0 --turn off bit 1 which indicates identity column
where id = object_id('table_name') and name = 'column_name'
go


exec sp_configure 'allow update', 0
go
reconfigure with override
go

***********************

এরপরে, আপনি সম্পর্কগুলি সেট করতে পারেন যাতে তারা বিদেশী কী উল্লেখগুলি আপডেট করে। অন্যথায় আপনার সম্পর্কের প্রয়োগ কার্যকর করতে হবে। এই এসও লিঙ্কটি কীভাবে দেখায়: কীভাবে বিদেশী কী সীমাবদ্ধতা টি-এসকিউএল ব্যবহার করে সাময়িকভাবে অক্ষম করা যায়?

এখন, আপনি আপনার আপডেটগুলি করতে পারেন। একই কলামের নামের উপর ভিত্তি করে আমার সমস্ত আপডেট এসকিউএল লিখতে আমি একটি শর্ট স্ক্রিপ্ট লিখেছিলাম (আমার ক্ষেত্রে, আমার কেসআইডিডিড 1,000,000 বাড়ানো দরকার:

select 
'update ['+c.table_name+'] SET ['+Column_Name+']=['+Column_Name+']+1000000'
from Information_Schema.Columns as c
JOIN Information_Schema.Tables as t ON t.table_Name=c.table_name and t.Table_Schema=c.table_schema and t.table_type='BASE TABLE'
where Column_Name like 'CaseID' order by Ordinal_position

শেষ অবধি, রেফারেন্সিয়াল অখণ্ডতা পুনরায় সক্ষম করুন এবং তারপরে প্রাথমিক কীতে সনাক্তকরণ কলামটি পুনরায় সক্ষম করুন।

দ্রষ্টব্য: আমি এই প্রশ্নগুলিতে কিছু লোক দেখতে পাচ্ছি কেন জিজ্ঞাসা করুন। আমার ক্ষেত্রে, আমাকে দ্বিতীয় উত্পাদনের উদাহরণ থেকে একটি মাস্টার ডিবিতে মার্জ করতে হবে যাতে আমি দ্বিতীয় দৃষ্টান্তটি বন্ধ করতে পারি। সংঘাত না ঘটাতে আমার কেবল সমস্ত অপারেশন ডেটা প্রয়োজন need মেটা ডেটা এফকে একরকম।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.