MySQL tablomdan kısıtlamalar nasıl kaldırılır?


252

Kısıtlamaları masamdan kaldırmak istiyorum. Sorgum:

ALTER TABLE `tbl_magazine_issue` 
DROP CONSTRAINT `FK_tbl_magazine_issue_mst_users`

Ama bir hata aldım:

#1064- SQL sözdiziminizde bir hata var; FK_tbl_magazine_issue_mst_users1. satırdaki 'kısıtlamanın ' yakınında kullanılacak doğru sözdizimi için MySQL sunucu sürümünüze karşılık gelen kılavuza bakın


1
Bir CHECKkısıtlama oluşturduysanız , herhangi bir gerçek kısıtlama oluşturulmadığından, bırakmaya gerek olmadığını belirtmek gerekir. information_schema.table_constraintsDoğrulamak için seçim yapabilirsiniz ve hatta add constraintherhangi bir hata olmadan tekrar tekrar çalıştırabilirsiniz . MySQL, CHECKkısıtlamaları desteklemez, ancak SQL'in bunları oluşturmasına izin verir (aslında kısıtlamalar yaratmadan).
ADTC



Sözdiziminiz tamamen geçerli ve artık desteklenmektedir demo
Lukasz Szozda

Yanıtlar:


423

Mysql, yabancı anahtar kısıtlamalarını bırakmak için özel bir sözdizimine sahiptir:

ALTER TABLE tbl_magazine_issue
  DROP FOREIGN KEY FK_tbl_magazine_issue_mst_users

21
Postgres, MSSQL ve Oracle'ın hepsi var alter table .. drop constraint. MySQL tuhaf biri, öyle görünüyor.
Jared Beck

Yabancı bir anahtar kısıtlamasında gerekli olduğu için "sütun2" yi bırakamayacağını söylüyor. Dediğin gibi "DAMLA DÜŞÜR sütun2; sütun / anahtar var" kontrol edin
Lealo

Tamam anladım, yabancı, sütunu diğer tablo sütunlarına bağlayan ayrı bir şey. Benimki standart bir isme sahipti. Ayrıca şimdi ben sütunun kendisi düşmeden yabancı anahtarları güvenli bir şekilde bırakabilirsiniz
Lealo

1
Wellington Lorindo'nun çözümü daha doğru olarak görülebilir, çünkü sadece yabancı anahtarı kaldırmak ilgili dizini kaldırmaz. Tabii ki indeks ayrı olarak oluşturulmuş olabilir, ancak yabancı anahtarı ilk etapta eklemenin bir sonucu olarak oluşturulduysa, o zaman sadece yabancı anahtar bırakılarak kaldırılmaz.
Rich Harding

55

Aynı sorunu vardı ve bu kod ile çözmek lazım:

ALTER TABLE `table_name` DROP FOREIGN KEY `id_name_fk`;
ALTER TABLE `table_name` DROP INDEX  `id_name_fk`;

2
Bu, kabul edilen çözümden daha doğru olarak görülebilir, çünkü sadece yabancı anahtarı kaldırmak dizini kaldırmaz. Tabii ki indeks ayrı ayrı oluşturulmuş olabilir, ancak yabancı anahtarı ilk etapta eklemenin bir sonucu olarak yaratıldıysa, sadece yabancı anahtar bırakılarak kaldırılmaz.
Zengin Harding

3
Tek bir komut olarak: ALTER TABLE table_name DROP FOREIGN KEY IF EXISTS id_name_fk, DROP INDEX IF EXISTS id_name_fk;
Frank Forte

26

MySQL'de olduğu gibi bir şey yoktur DROP CONSTRAINT. Sizin durumunuzda kullanabilirsiniz DROP FOREIGN KEY.


12

Kısıtlama yabancı bir anahtar değilse, ör. biri 'UNIQUE CONSTRAINT (colA, colB)' kullanılarak eklendi, sonra kullanılarak bırakılabilecek bir dizinALTER TABLE ... DROP INDEX ...


9

Ayrıca güzel, mysql veritabanındaki tüm yabancı anahtar kontrollerini geçici olarak devre dışı bırakabilirsiniz: SET FOREIGN_KEY_CHECKS=0; Ve tekrar etkinleştirmek için: SET FOREIGN_KEY_CHECKS=1;


8

Robert Knight'ın cevabına biraz eklemek için, yazının başlığı yabancı anahtarlardan bahsetmediği için (ve tam kod örnekleri olmadığından ve SO'nun yorum kod blokları yanı sıra cevapların kodunu göstermediğinden bloklar), bunu benzersiz kısıtlamalar için ekleyeceğim . Bu iki çalışma da kısıtlamayı kaldırmak için çalışır:

ALTER TABLE `table_name` DROP KEY `uc_name`;

veya

ALTER TABLE `table_name` DROP INDEX `uc_name`;

4

Bazı ORM'ler veya çerçeveler, yabancı anahtarlar için varsayılandan farklı bir adlandırma kuralı kullanır FK_[parent table]_[referenced table]_[referencing field], çünkü bunlar değiştirilebilir.

Laravel örneğin [parent table]_[referencing field]_foreignadlandırma kuralı olarak kullanır . Burada gösterildiği gibi bu sorguyu kullanarak yabancı anahtarların adlarını gösterebilirsiniz :

SELECT CONSTRAINT_NAME FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE 
WHERE REFERENCED_TABLE_SCHEMA = '<database>' AND REFERENCED_TABLE_NAME = '<table>';

Daha sonra yukarıda belirtilen DROP FOREIGN KEY sorgusunu ve doğru adını çalıştırarak yabancı anahtarı kaldırın.


2

Buraya MariaDB kullanarak gelenler için:

MariaDB'nin DROP CONSTRAINT deyimlerine genel olarak izin verdiğine dikkat edin, örneğin çek kısıtlamalarını bırakmak için:

ALTER TABLE table_name
DROP CONSTRAINT constraint_name;

https://mariadb.com/kb/en/library/alter-table/


Evet, örneğin aynı tablodaki kısıtlamalar içindir CONSTRAINT CHECK(a > b). Yabancı anahtar kısıtlamaları için DROP FOREIGN KEY, en azından MariaDB sürüm 10.2'de sözdizimine ihtiyacınız olduğu görülüyor
Frank Forte

1
  1. Tablonun yapı görünümüne git
  2. Üstte 2 seçenek göreceksiniz a.Tablo yapısı b. İlişki görünümü .
  3. Şimdi tıklayın Bağlantı görünümünde burada size yabancı anahtar kısıtlamasını bırakın. Burada tüm ilişkileri alacaksınız.

Bu harika, kimliği bilmediğinde benim için çalıştı
Silviu St

0

DROP CONSTRAINTMySql'de yoktur . MySQL 5.7 sihir gibi bu çalışma

ALTER TABLE answer DROP KEY const_name;

0

Kısıtlamayı kaldırmanın en basit yolu ALTER TABLE tbl_name DROP CONSTRAINT symbol;, MySQL 8.0.19'da sunulan sözdizimini kullanmaktır :

MySQL 8.0.19 itibariyle, ALTER TABLE, kısıtlama türünün sınırlama adından belirlendiği herhangi bir türdeki mevcut kısıtlamaları bırakmak ve değiştirmek için daha genel (ve SQL standardı) sözdizimine izin verir

ALTER TABLE tbl_magazine_issue DROP CONSTRAINT FK_tbl_magazine_issue_mst_users;

db <> keman demosu


-4

Bu, kısıtlamaları bırakmak için MySQL üzerinde çalışacaktır

alter table tablename drop primary key;

alter table tablename drop foreign key;

DROP PRIMARY KEYçalışmamalı. DROP FOREIGN KEYçalışır, ancak kime yapılacağını belirtmeniz gerekir drop. ÖrneğinALTER TABLE tablename DROP FOREIGN KEY id_name_fk
RousseauAlexandre
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.