سؤال

الآن بعد أن نفد منا int القدرة على عمود PK (وهو IDENTITY) أود أن أفعل هذا ل bigint, ولكنها بسيطة ALTER TABLE يبدو أنه غير قادر على التعامل مع هذا الحجم الكبير من الطاولة.لذلك سؤالي هو:كيف يمكنني تغيير نوع عمود PK مع الاحتفاظ بالقيم الفعلية في مكانها وهل أحتاج إلى تغيير الجداول المرجعية أيضًا؟

هل كانت مفيدة؟

المحلول

وبالإضافة إلى اقتراح KLE والاستعلامات التالية قد تساعد:

لتعطيل كافة القيود على الجداول التي تشير oldTable محاولة تنفيذ إخراج الاستعلام التالي:

SELECT 'ALTER TABLE ' + OBJECT_NAME(fk.parent_object_id) + ' NOCHECK CONSTRAINT ' + fk.name
FROM sys.foreign_keys fk
INNER JOIN sys.foreign_key_columns AS fkc ON fk.OBJECT_ID = fkc.constraint_object_id
WHERE OBJECT_NAME (fk.referenced_object_id) = 'oldTable'

لنقل كافة البيانات إلى الجدول الجديد، مع تغيير في الحقل حاول هذا:

INSERT INTO newTable
SELECT CONVERT(BIGINT, ID) AS ID, COL1, COL2, ..., COLN
FROM oldTable

لإسقاط الجدول القديم:

DROP TABLE oldTable

لإعادة تسمية الجدول الجديد إلى الاسم القديم:

sp_rename newTable, oldTable

لإعادة تمكين كافة القيود على الجداول التي تشير oldTable، في محاولة لتنفيذ إخراج الاستعلام التالي:

SELECT 'ALTER TABLE ' + OBJECT_NAME(fk.parent_object_id) + ' CHECK CONSTRAINT ' + fk.name
FROM sys.foreign_keys fk
INNER JOIN sys.foreign_key_columns AS fkc ON fk.OBJECT_ID = fkc.constraint_object_id
WHERE OBJECT_NAME (fk.referenced_object_id) = 'oldTable'

ونأمل أن يساعد ...

نصائح أخرى

ما سنفعله هو:

احفظ الجدول الخاص بك

  1. إنشاء جدول جديد بالبنية الصحيحة
  2. قم بتعطيل كافة القيود الموجودة على هذه الجداول وتلك التي تشير إليها
  3. نقل كافة البيانات إلى الجدول الجديد، مع تغيير الحقل؛ويمكن أن يتم ذلك على دفعات
  4. احذف الجدول القديم عندما يكون فارغًا
  5. إعادة تسمية الجدول الجديد إلى الاسم القديم
  6. تمكين جميع القيود على جميع الجداول (ربما تحتاج بعض أعمدة وقيود FK إلى الإصلاح أيضًا ...لكنها ليست PK، لذا فهي قابلة للتعديل)

    6 تم تحريره (بفضل أليكسي)

وهذا أمر نظيف، وقابل للتنفيذ على دفعات، ومفهوم جيدًا.

وسوف تحتاج إلى تغيير أيضا الجداول الطفل. بعد كل ما سوف يكون الآن يحاول إدراج كثافة كبيرة في لهم كذلك. وأود أن تتغير مع مرور الجداول الطفل أولا

وهذه ليست عملية سهلة أو قصيرة. أود أن أقترح عليك أن تخبر المستخدمين في قاعدة البيانات ستكون للصيانة (يمكنك قياس مدى فترة طويلة من الزمن الذي يستغرقه للقيام ديف) على الموعد المحدد وإعادة زرع قاعدة البيانات إلى وضع مستخدم واحد في حين جعل لكم هذه التغيرات. كنت لا تريد أن تفقد البيانات التي يتم إضافتها (أو تغييرها) من قبل المستخدمين على طاولة واحدة في حين كنت التحول إلى الآخر. إذا لsomereason لا يمكنك havea نافذة ماينتينسي (وأنا أقترح بقوة من أجل سلامة البيانات التي لديك)، ثم يجب تغيير الجداول الطفل خلال أول لتجنب الأخطاء إدراج إذا كان لديك وثيقة حقا إلى الحد الأقصى، وسيكون رؤية أعداد كبيرة الفور تقريبا.

تأكد من أن البرنامج النصي هيكل datbase بأكمله بما في ذلك التخلف، مشغلات، تحقق constrants الفهارس الخ كما سوف تحتاج إلى إعادة كل شيء.

تأكد من أن تفعل كل هذا من خلال البرامج النصية على ديف. وهذا سيجعل من الاسهل بكثير للقيام همز واحد مرة واحدة كنت قد اختبرت عملية الخروج.

وأنا أعتقد أنه يمكنك فقط إنشاء قاعدة بيانات جديدة مع نوع البيانات متغير PK، ومن ثم تصدير / استيراد البيانات، أو إدراج مجمعة إلى جديد، ثم إعادة تسمية قاعدة البيانات الجديدة. بالطبع هذا الفعلية إذا كان لديك العديد من الجداول المشار إليها والجديد الخاص بك نوع البيانات PK غير متوافقة مع السابق.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top