it-swarm.asia

لا يمكن إسقاط القيد غير موجود ولا يمكن إنشاؤه أيضًا

أثناء اختبار بعض نصوص الترحيل بنسخة من بيانات الإنتاج (تعمل النصوص البرمجية بشكل جيد مع بيانات التطوير) ، وجدت وضعية غريبة. تم تغيير CONSTRAINT لذا فأنا أصدر أوامر DROP + ADD:

ALTER TABLE A_DUP_CALLE
DROP CONSTRAINT A_DUP_CALLE_UK1;

ALTER TABLE A_DUP_CALLE
ADD CONSTRAINT A_DUP_CALLE_UK1 UNIQUE (
    CONTROL_ID,
    CALLE_AYTO_DUPL
)
ENABLE;

عمل الأمر DROP بشكل جيد ولكن فشل ADD. الآن ، أنا في حلقة مفرغة. لا يمكنني إسقاط القيد لأنه غير موجود (عمل الإسقاط الأولي كما هو متوقع):

ORA-02443: لا يمكن إسقاط القيد - قيد غير موجود

ولا يمكنني إنشاؤه لأن الاسم موجود بالفعل:

ORA-00955: الاسم مستخدم بالفعل من قبل كائن موجود

انا اطبع A_DUP_CALLE_UK1 في مربع بحث مطور SQL و ... هناك! المالك ، اسم الجدول ، منظر الطاولة ... كل شيء متطابق: ليس كائنًا مختلفًا يحمل نفس الاسم ، إنه هو القيد الأصلي. يظهر الجدول في تفاصيل القيد ولكن القيد لا يظهر في تفاصيل الجدول.

أسئلتي:

  • ما هو تفسير ذلك؟
  • كيف يمكنني ضمان عدم حدوث ذلك عندما أقوم بالترقية الحقيقية في الخادم المباشر؟

(الخادم 10 جرام XE ، ليس لدي سمعة كافية لإنشاء العلامة.)

16
Álvaro González

في حالة تخمين أقول إن ماريان على حق وهذا ناتج عن فهرس فريد وقيد يحمل نفس الاسم ، على سبيل المثال:

create table t( k1 integer, k2 integer, 
                constraint u1 unique(k1,k2) using index(create unique index u1 on t(k1,k2)),
                constraint u2 unique(k2,k1) using index u1);

select count(*) from user_indexes where index_name='U1';

COUNT(*)               
---------------------- 
1  

alter table t drop constraint u1;

select count(*) from user_indexes where index_name='U1';

COUNT(*)               
---------------------- 
1  

عادة عند إضافة قيد فريد ، يتم إنشاء فهرس فريد يحمل نفس الاسم - ولكن الفهرس والقيد ليسا نفس الشيء. ألق نظرة على all_indexes لمعرفة ما إذا كان هناك فهرس يسمى A_DUP_CALLE_UK1 وحاول معرفة ما إذا كان يستخدمه شيء آخر قبل أن تسقطه!

13
Jack says try topanswers.xyz

يبدو غريبا جدا.

يمكنك الجري:

 SELECT *
 FROM user_objects
 WHERE object_name = 'A_DUP_CALLE_UK1'

للتحقق من نوع الكائن الذي تشتكي منه أوراكل. ثم يمكنك تشغيل بيان DROP المُصدق لذلك.

الشيء الآخر الوحيد الذي يمكنني التفكير فيه هو إسقاط الطاولة بالكامل باستخدام DROP TABLE A_DUP_CALLE CASCADE CONSTRAINTS للتخلص من كل ما يخص هذا الجدول ثم إعادة إنشائه بالكامل.

إذا احتوى الجدول على بيانات قيمة ، يمكنك عمل نسخة احتياطية منها قبل:

CREATE TABLE old_data
AS
SELECT *
FROM A_DUP_CALLE;

بمجرد قيامك بإعادة إنشاء الجدول ، يمكنك القيام بذلك

INSERT INTO A_DUP_CALLE (col1, col2, col3) 
SELECT col1, col2, col3
FROM old_data

لاستعادة البيانات.

6
a_horse_with_no_name

لقد واجهت نفس المشكلة قبل بضع دقائق ... ووجدت تفسيرًا.

من خلال إنشاء مفتاح أساسي ، تقوم Oracle بإنشاء كائنين: قيد وفهرس يتحكم في جزء "فريد".

من خلال إسقاط القيد ، يبقى الفهرس هناك ، باستخدام نفس اسم الفهرس ، لذلك إذا قمت بالتنفيذ فقط

alter table t drop constraint u1;

سوف تسقط القيد فقط. لإسقاط المؤشر ، ستحتاج إلى التنفيذ

drop index u1;

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

alter table t drop constraint u1 including indexes;
5
Cristian Meneses A

يأتي قيد المفتاح الأساسي بالفهرس. تسقط القيد ولكن ليس الفهرس. التحقق من:

select * from ALL_OBJECTS where OBJECT_NAME = 'PK_TBL_CONSTR';

وترى OBJECT_TYPE هو INDEX.

لذا افعل كليهما:

alter table TBL drop constraint PK_TBL_CONSTR;
drop index PK_TBL_CONSTR;
1
gavenkoa

افعل هذا

ALTER TABLE A_DUP_CALLE
DROP CONSTRAINT "A_DUP_CALLE_UK1";

سوف تعمل.

الصورة: enter image description here

1
Sachin