এসকিউএল ড্রপ টেবিলে বিদেশী কী বাধা


154

আমি যদি এইভাবে আমার ডাটাবেসে সমস্ত টেবিল মুছে ফেলতে চাই তবে এটি কী বিদেশী কী বাধাটি যত্ন নেবে? যদি তা না হয় তবে আমি কীভাবে প্রথমে যত্ন নেব?

GO
IF OBJECT_ID('dbo.[Course]','U') IS NOT NULL
    DROP TABLE dbo.[Course]
GO
IF OBJECT_ID('dbo.[Student]','U') IS NOT NULL
    DROP TABLE dbo.[Student]


2
); এই উত্তর চেক করুন, এটা আমাকে সাহায্য stackoverflow.com/a/5488670/2205144
xatz

উত্তর:


335

না, যদি সেখানে বিদেশী কী উল্লেখ করা হয় তবে এটি আপনার টেবিলটি ফেলে দেবে না।

আপনার টেবিলটি উল্লেখ করে সমস্ত বিদেশী কী সম্পর্কগুলি পেতে, আপনি এই এসকিউএল ব্যবহার করতে পারেন (আপনি এসকিউএল সার্ভার 2005 এবং তার উপর থাকলে):

SELECT * 
FROM sys.foreign_keys
WHERE referenced_object_id = object_id('Student')

এবং যদি এখানে কিছু থাকে তবে এই বিবৃতি সহ আপনি এসকিউএল বিবৃতি তৈরি করতে পারেন সেই প্রকৃত এফকে সম্পর্কগুলি ফেলে দেওয়ার জন্য:

SELECT 
    'ALTER TABLE [' +  OBJECT_SCHEMA_NAME(parent_object_id) +
    '].[' + OBJECT_NAME(parent_object_id) + 
    '] DROP CONSTRAINT [' + name + ']'
FROM sys.foreign_keys
WHERE referenced_object_id = object_id('Student')

দ্রষ্টব্য: উত্পন্ন টেবিলটিতে পৃথক ক্যোয়ারিতে চালানোর জন্য পৃথক প্রতিবন্ধকতা মুছতে বিবৃতি রয়েছে। এটি আমার ক্ষেত্রে বিস্ময়কর কাজ করেছে যেহেতু এফকে থাকা বাকী টেবিলগুলি অক্ষত রাখার সময় আমাকে একটি বেহুদা টেবিলটি (পরীক্ষার উদ্দেশ্যে) মুক্ত করতে হবে।
মরিসিও কুইন্টানা

1
আমাকে রেফারেন্স_বজেক্ট_আইডি এর পরিবর্তে প্যারেন্ট_বজেক্ট_আইডিটি ব্যবহার করতে হয়েছিল
টম রবিনসন

2
সমস্ত রেফারেন্সিং টেবিল পাওয়ার জন্য SELECT স্টেটমেন্টের বিকল্প হ'ল: এক্সেক স্প_ফেকিজ 'স্টুডেন্ট';
বুগিবিয় 21

এই সাময়িক সাময়িক সামঞ্জস্যটি 'অল্টার টেবিলে' + OBJECT_SCHEMA_NAME (প্যারেন্ট_বজেক্ট_আইডি) + 'নির্বাচন করুন [ কনস্ট্রাক্ট নাম সহ
স্টাস সোভিশভ

1
ভেরিয়েবল হিসাবে আপনার শেষ নির্বাচনকে কীভাবে নির্ধারণ করবেন এবং এটি সম্পাদন করবেন?
হ্রভোজে টি

44

এসকিউএল সার্ভার ম্যানেজমেন্ট স্টুডিও 2008 (আর 2) এবং আরও নতুনতে আপনি ডানদিকে ক্লিক করতে পারেন

ডিবি -> টাস্ক -> স্ক্রিপ্ট তৈরি করুন

  • আপনি যে টেবিলগুলি ড্রপ করতে চান তা নির্বাচন করুন।

  • "নতুন ক্যোয়ারী উইন্ডোতে সংরক্ষণ করুন" নির্বাচন করুন।

  • অ্যাডভান্সড বাটনে ক্লিক করুন।

  • স্ক্রিপ্ট DROP সেট করুন এবং স্ক্রিপ্ট DROP এ তৈরি করুন।

  • স্ক্রিপ্টের বিদেশী কীগুলি সেট করুন।

  • ঠিক আছে ক্লিক করুন।

  • Next -> Next -> সমাপ্তি ক্লিক করুন।

  • স্ক্রিপ্টটি দেখুন এবং তারপরে এক্সিকিউট করুন।


12
এখনও একই 'অবজেক্ট' my_table 'ফেলতে পারেনি কারণ এটি একটি বিদেশী কী বাধা দ্বারা রেফারেন্স করা হয়েছে।
ফ্রেনকিবি

6
এই উত্তরটির কীভাবে 28 + রেটিং রয়েছে আমার বাইরে ... এখনও সাথী কাজ করে না
AltF4_

1
এটি স্ক্রিপ্ট উত্পন্ন করার সময় - সেই স্ক্রিপ্টটি সমস্যার সমাধান করে না, যা বিদেশী কী সীমাবদ্ধতার দ্বারা উল্লেখ করা সারণীটি ড্রপ করে।
অ্যালেক্সি শেভলিভ

আমার জন্য একটি কবজ মত কাজ।
জোহান

21

আপনি যদি প্রথমে "শিশু" টেবিলটি ফেলে দেন তবে বিদেশী কীটিও বাদ দেওয়া হবে। আপনি যদি প্রথমে "পিতামাতা" টেবিলটি ফেলে দেওয়ার চেষ্টা করেন তবে আপনি একটি "অবজেক্ট 'এ ड्रপ করতে পারেনি কারণ এটি একটি বিদেশী কী বাধা দ্বারা রেফারেন্স করা হয়েছে।" ত্রুটি.


2
সত্য, তবে কোনও সমাধান নেই। সন্তানের কাছে টেবিলে বিদেশী চাবি থাকতে পারে এবং / অথবা আপনি এটি প্রথম স্থানে ফেলে রাখতে চান না।
18-18

4
সত্য, এবং একটি সমাধান যদি লক্ষ্য হিসাবে বলা হয়, "যদি আমি আমার ডাটাবেসে থাকা সমস্ত টেবিলগুলি মুছতে চাই ..."
ফিলিপ কেলি

4
এটি গৃহীত প্রশ্নের চেয়ে অনেক বেশি উত্তম উত্তর, যে প্রশ্নকর্তা "আমার ডাটাবেসের সমস্ত টেবিল মুছতে" চান
লুখে

17

sp_MSdropconstraintsপদ্ধতি ব্যবহার করে সমস্ত সারণী সঠিকভাবে ফেলে দেওয়ার জন্য এখানে অন্য উপায় is আমি মনে করতে পারি সবচেয়ে সংক্ষিপ্ত কোড:

exec sp_MSforeachtable "declare @name nvarchar(max); set @name = parsename('?', 1); exec sp_MSdropconstraints @name";
exec sp_MSforeachtable "drop table ?";

দুর্দান্ত মানুষ ............
এডকোডার

2

এটি যদি এসকিউএল সার্ভার হয় তবে আপনি টেবিলটি ফেলে দেওয়ার আগে আপনাকে অবশ্যই বাধাটি ফেলে দিতে হবে।


2

@মার্ক_স যা পোস্ট করেছে তার সামান্যতর জেনেরিক সংস্করণ এটি আমাকে সহায়তা করেছে

SELECT 
'ALTER TABLE ' +  OBJECT_SCHEMA_NAME(k.parent_object_id) +
'.[' + OBJECT_NAME(k.parent_object_id) + 
'] DROP CONSTRAINT ' + k.name
FROM sys.foreign_keys k
WHERE referenced_object_id = object_id('your table')

কেবল আপনার টেবিলের নামটি প্লাগ করুন এবং এর ফলাফলটি কার্যকর করুন।


1
হাই, আমি উপরের দিক দিয়ে আমার বিদেশী কী বাধাগুলি ফেলে দেওয়ার চেষ্টা করেছি, কিন্তু পরে যখন আমি একটি টেবিল ফেলে যাই তখন এটি বলে যে "অবজেক্টটি ফেলে দেওয়া যায় না কারণ এটি এখনও কোনও বিদেশী কী বাধা দ্বারা উল্লেখ করা হচ্ছে ... কোন ধারনা ধন্যবাদ আগাম।
daniness

1

টেবিলগুলি অনুসরণ করে সমস্ত প্রতিবন্ধকতাগুলি মুছে ফেলার আরও একটি উপায় এখানে রয়েছে FOR XML PATH('')যার সাথে যুক্ত থাকে একটি যুক্তিযুক্ত কৌশল যা একক আউটপুট সারিতে একাধিক ইনপুট সারিগুলিকে মার্জ করতে দেয়। এসকিউএল 2005 এবং পরবর্তী সময়ে যে কোনও বিষয়ে কাজ করা উচিত।

আমি নিরাপত্তার জন্য মন্তব্য করা মন্তব্যগুলি ছেড়ে দিয়েছি left

DECLARE @SQL NVARCHAR(max)
;WITH fkeys AS (
    SELECT quotename(s.name) + '.' + quotename(o.name) tablename, quotename(fk.name) constraintname 
    FROM sys.foreign_keys fk
    JOIN sys.objects o ON fk.parent_object_id = o.object_id
    JOIN sys.schemas s ON o.schema_id = s.schema_id
)
SELECT @SQL = STUFF((SELECT '; ALTER TABLE ' + tablename + ' DROP CONSTRAINT ' + constraintname
FROM fkeys
FOR XML PATH('')),1,2,'')

-- EXECUTE(@sql)

SELECT @SQL = STUFF((SELECT '; DROP TABLE ' + quotename(TABLE_SCHEMA) + '.' + quotename(TABLE_NAME) 
FROM INFORMATION_SCHEMA.TABLES 
FOR XML PATH('')),1,2,'')

-- EXECUTE(@sql)

এটি ভালভাবে কাজ করে না কারণ সমস্ত এফকে বাদ দেওয়া হবে না (কেবলমাত্র যেখানে আমাদের টেবিলগুলি পিতামাতার হিসাবে ব্যবহৃত হয়, সেখানে আমাদের টেবিলটি "রেফারেন্সড" হিসাবে ব্যবহৃত হয়েছিল সেখানেও আমাদের সীমাবদ্ধতা বাদ দেওয়া উচিত)।
রোমান পোক্রভস্কিজ

রোমান, মূল পোস্টটি বিদেশী কী বাধা মুছে ফেলা সম্পর্কে। আমার উত্তরটি এর বাইরে কিছু আচ্ছাদন করার লক্ষ্য রাখে না।
ওয়ারেন রুমাক

1

একটি সমাধান বাস্তবায়নের জন্য এখানে একটি সম্পূর্ণ স্ক্রিপ্ট:

create Procedure [dev].DeleteTablesFromSchema
(
    @schemaName varchar(500)
)
As 
begin
    declare @constraintSchemaName nvarchar(128), @constraintTableName nvarchar(128),  @constraintName nvarchar(128)
    declare @sql nvarchar(max)
    -- delete FK first
    declare cur1 cursor for
    select distinct 
    CASE WHEN t2.[object_id] is NOT NULL  THEN  s2.name ELSE s.name END as SchemaName,
    CASE WHEN t2.[object_id] is NOT NULL  THEN  t2.name ELSE t.name END as TableName,
    CASE WHEN t2.[object_id] is NOT NULL  THEN  OBJECT_NAME(d2.constraint_object_id) ELSE OBJECT_NAME(d.constraint_object_id) END as ConstraintName
    from sys.objects t 
        inner join sys.schemas s 
            on t.[schema_id] = s.[schema_id]
        left join sys.foreign_key_columns d 
            on  d.parent_object_id = t.[object_id]
        left join sys.foreign_key_columns d2 
            on  d2.referenced_object_id = t.[object_id]
        inner join sys.objects t2 
            on  d2.parent_object_id = t2.[object_id]
        inner join sys.schemas s2 
            on  t2.[schema_id] = s2.[schema_id]
    WHERE t.[type]='U' 
        AND t2.[type]='U'
        AND t.is_ms_shipped = 0 
        AND t2.is_ms_shipped = 0 
        AND s.Name=@schemaName
    open cur1
    fetch next from cur1 into @constraintSchemaName, @constraintTableName, @constraintName
    while @@fetch_status = 0
    BEGIN
        set @sql ='ALTER TABLE ' + @constraintSchemaName + '.' + @constraintTableName+' DROP CONSTRAINT '+@constraintName+';'
        exec(@sql)
        fetch next from cur1 into @constraintSchemaName, @constraintTableName, @constraintName
    END
    close cur1
    deallocate cur1

    DECLARE @tableName nvarchar(128)
    declare cur2 cursor for
    select s.Name, p.Name
    from sys.objects p
        INNER JOIN sys.schemas s ON p.[schema_id] = s.[schema_id]
    WHERE p.[type]='U' and is_ms_shipped = 0 
    AND s.Name=@schemaName
    ORDER BY s.Name, p.Name
    open cur2

    fetch next from cur2 into @schemaName,@tableName
    while @@fetch_status = 0
    begin
        set @sql ='DROP TABLE ' + @schemaName + '.' + @tableName
        exec(@sql)
        fetch next from cur2 into @schemaName,@tableName
    end

    close cur2
    deallocate cur2

end
go

1
Removing Referenced FOREIGN KEY Constraints
Assuming there is a parent and child table Relationship in SQL Server:

--First find the name of the Foreign Key Constraint:
  SELECT * 
  FROM sys.foreign_keys
  WHERE referenced_object_id = object_id('States')

--Then Find foreign keys referencing to dbo.Parent(States) table:
   SELECT name AS 'Foreign Key Constraint Name', 
           OBJECT_SCHEMA_NAME(parent_object_id) + '.' + OBJECT_NAME(parent_object_id) AS 'Child Table'
   FROM sys.foreign_keys 
   WHERE OBJECT_SCHEMA_NAME(referenced_object_id) = 'dbo' AND 
              OBJECT_NAME(referenced_object_id) = 'dbo.State'

 -- Drop the foreign key constraint by its name 
   ALTER TABLE dbo.cities DROP CONSTRAINT FK__cities__state__6442E2C9;

 -- You can also use the following T-SQL script to automatically find 
 --and drop all foreign key constraints referencing to the specified parent 
 -- table:

 BEGIN

DECLARE @stmt VARCHAR(300);

-- Cursor to generate ALTER TABLE DROP CONSTRAINT statements  
 DECLARE cur CURSOR FOR
 SELECT 'ALTER TABLE ' + OBJECT_SCHEMA_NAME(parent_object_id) + '.' + 
 OBJECT_NAME(parent_object_id) +
                ' DROP CONSTRAINT ' + name
 FROM sys.foreign_keys 
 WHERE OBJECT_SCHEMA_NAME(referenced_object_id) = 'dbo' AND 
            OBJECT_NAME(referenced_object_id) = 'states';

 OPEN cur;
 FETCH cur INTO @stmt;

 -- Drop each found foreign key constraint 
  WHILE @@FETCH_STATUS = 0
  BEGIN
    EXEC (@stmt);
    FETCH cur INTO @stmt;
  END

  CLOSE cur;
  DEALLOCATE cur;

  END
  GO

--Now you can drop the parent table:

 DROP TABLE states;
--# Command(s) completed successfully.

0

এসকিউএল সার্ভার ম্যানেজার ব্যবহার করে আপনি ইউআই থেকে বিদেশী কী বাধাগুলি ফেলে দিতে পারেন। আপনি যদি টেবিলটি মুছতে চান Diaryতবে ব্যবহারকারী সারণিতে একটি বিদেশী কী রয়েছে DiaryIdযা Diaryটেবিলের দিকে নির্দেশ করছে , আপনি টেবিলটি প্রসারিত করতে পারেন (প্লাস চিহ্নটি ব্যবহার করে) Userএবং তারপরে Foreign Keysবিভাগটি প্রসারিত করতে পারেন । ডায়রি টেবিলের দিকে নির্দেশ করে বিদেশী কীতে ডান ক্লিক করুন এবং তারপরে নির্বাচন করুন Delete। তারপরে আপনি Columnsবিভাগটি প্রসারিত করতে পারবেন , ডান ক্লিক করুন এবং কলামটিও মুছুন DiaryId। তারপরে আপনি কেবল চালাতে পারবেন:

drop table Diary

আমি জানি আপনার আসল প্রশ্নটি সমস্ত টেবিল মোছার বিষয়ে, তাই এটি এই ক্ষেত্রে কার্যকর হতে পারে না। তবে, আপনি যদি কেবল কয়েকটি টেবিল মুছতে চান তবে এটি দরকারী আমার বিশ্বাস (শিরোনামে সমস্ত টেবিল মোছার বিষয়টি স্পষ্টভাবে উল্লেখ করা হয়নি)।


0

আপনি যদি কোনও মাইএসকিএল সার্ভারে থাকেন এবং আপনার টেবিলগুলি হারাতে আপত্তি না দেখায় আপনি একাধিক টেবিল একবারে মুছতে একটি সাধারণ প্রশ্নটি ব্যবহার করতে পারেন:

SET foreign_key_checks = 0;
DROP TABLE IF EXISTS table_a,table_b,table_c,table_etc;
SET foreign_key_checks = 1;

আপনি কোয়েরিতে সারণিটি কী অর্ডারটি ব্যবহার করেন সেভাবে কোনও ব্যাপার নয়।

যদি আপনার কাছে অনেকগুলি টেবিল সহ একটি ডাটাবেস থাকে তবে এটি কোনও ভাল সমাধান নয় এই সত্য সম্পর্কে কিছু বলতে চাই: আমি সম্মত!


আমি পেয়েছিIncorrect syntax near '='. (102) (SQLExecDirectW)
ম্যাট

@ ম্যাট বিট অনুমান করা কঠিন যে কোন '=' এ আপনি সেই ত্রুটি পেয়েছেন get
এলস ড্যান আইপ

3
foreign_key_checksএমএসএসকিউএল সার্ভারে কাজ করবে না। আমি মনে করি এটি একটি মাইএসকিউএল নির্দিষ্ট পরিবর্তনশীল।
ooXei1sh

1
@ ooXei1sh এমএসএসকিউএলে নেই। এজন্য আমি আমার পোস্টের শুরুতে বলি: "আপনি যদি একটি এমওয়াইএসকিউএল সার্ভারে থাকেন"।
এলস ড্যান আইপ

0

বিদেশী কী সীমাবদ্ধতার নাম পেতে আপনার ড্রপকে ব্লক করে নীচের কোডটি কার্যকর করুন। উদাহরণস্বরূপ, আমি rolesটেবিলটি নিই ।

      SELECT *
      FROM sys.foreign_keys
      WHERE referenced_object_id = object_id('roles');

      SELECT name AS 'Foreign Key Constraint Name',
      OBJECT_SCHEMA_NAME(parent_object_id) + '.' + OBJECT_NAME(parent_object_id)
      AS 'Child Table' FROM sys.foreign_keys
      WHERE OBJECT_SCHEMA_NAME(referenced_object_id) = 'dbo'
      AND OBJECT_NAME(referenced_object_id) = 'dbo.roles'

আপনি নীচে হিসাবে এফকে নাম কিছু পাবেন: FK__Table1__roleId__1X1H55C1

উপরে থেকে এফকে রেফারেন্সটি সরাতে নীচের কোডটি চালান।

ALTER TABLE dbo.users drop CONSTRAINT FK__Table1__roleId__1X1H55C1;

সম্পন্ন!


-4

যদি আমি আমার ডাটাবেসে সমস্ত টেবিল মুছতে চাই

তারপরে পুরো ডাটাবেসটি ফেলে দেওয়া অনেক সহজ:

DROP DATABASE WorkerPensions

71
এটির জন্য আপনাকে একটি -1 প্রদান করা কারণ এটি দুটি গুরুত্বপূর্ণ কারণের জন্য প্রশ্নের বৈধ উত্তর নয়: 1) এটি টেবিলের চেয়ে অনেক বেশি মুছে দেয়! সঞ্চিত পদ্ধতি, ফাংশন, ইউডিটি, সুরক্ষা,। নেট অ্যাসেমব্লিজ ইত্যাদি সমস্ত ড্রপ ডেটাবেস দিয়ে চলে যায়। ২) আপনাকে ডাটাবেসগুলি তৈরি করতে দেওয়া হতে পারে না, যেমন কেন্দ্রীয়ভাবে পরিচালিত দেব পরিবেশ যেখানে ডাটাবেসগুলি আইটি দ্বারা সরবরাহ করা হয় এবং তৈরির সময় অতিরিক্ত প্রয়োজনীয়তা রয়েছে যা আপনি অবগত নন।
ওয়ারেন রুমাক

-4

আপনি যদি এমন DROPকোনও টেবিল চান যা বিদেশী কী ব্যবহার করে অন্য টেবিল দ্বারা রেফারেন্স করা হয়েছে

DROP TABLE *table_name* CASCADE CONSTRAINTS;
আমি মনে করি এটি আপনার পক্ষে কাজ করা উচিত।


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