MySQL Veritabanından Kısıtlamaların Listesi


92

Belirli bir veritabanındaki tüm kısıtlamaların bir listesini nasıl alabilirim?


1
MySQL'de birden fazla kısıtlama türü vardır. Ne demek istiyorsun Aradığınız şeye bir örnek verebilir misiniz?
— Mark Byers

Yanıtlar:


146

information_schema.table_constraintsHer tabloda tanımlanan kısıtlamaların adlarını almak için tabloyu kullanın :

select *
from information_schema.table_constraints
where constraint_schema = 'YOUR_DB'

information_schema.key_column_usageBu kısıtlamaların her birindeki alanları almak için tabloyu kullanın :

select *
from information_schema.key_column_usage
where constraint_schema = 'YOUR_DB'

Bunun yerine yabancı anahtar kısıtlamalarından bahsediyorsanız, şunu kullanın information_schema.referential_constraints:

select *
from information_schema.referential_constraints
where constraint_schema = 'YOUR_DB'

1
Bu liste yalnızca UNIQUE, PRIMARY KEY veya FOREIGN KEY kısıtlamalarını içerecektir. KONTROL mümkündür, ancak zorunlu değildir. VARSAYILAN kısıtlamalar bu sorgu kullanılarak görülemeyecektir.
— OMG Ponies

MySQL, CHECK kısıtlamalarını saklamaz. Birini tanımlamaya çalışırsanız, onu ayrıştırır ve sessizce atar.
— Bill Karwin

1
VARSAYILAN değer bir kısıtlama olarak sayılmaz. İçinde saklanıyor information_schema.columns.column_default.
— Bill Karwin

22

@Senseful tarafından harika yanıt.

Yalnızca kısıtlama adlarının listesini (ve diğer ayrıntıları / sütunları değil) arayanlar için değiştirilmiş sorgu sunuyorum:

SELECT DISTINCT(constraint_name) 
FROM information_schema.table_constraints 
WHERE constraint_schema = 'YOUR_DB' 
ORDER BY constraint_name ASC;

2
birini bulduğunuzda silmeniz gerekiyorsa, buraya bakın stackoverflow.com/a/838412/2401804
— r3wt

9

Bu, birincil ve yabancı anahtar kısıtlamalarının yanı sıra ON_UPDATE ve ON_DELETE gibi bu kısıtlamalara ilişkin kuralları ve sütun ve yabancı sütun adlarını bir arada görmek istiyorsanız gerçekten yardımcı olur:

SELECT tc.constraint_schema,tc.constraint_name,tc.table_name,tc.constraint_type,kcu.table_name,kcu.column_name,kcu.referenced_table_name,kcu.referenced_column_name,rc.update_rule,rc.delete_rule

FROM information_schema.table_constraints tc

inner JOIN information_schema.key_column_usage kcu
ON tc.constraint_catalog = kcu.constraint_catalog
AND tc.constraint_schema = kcu.constraint_schema
AND tc.constraint_name = kcu.constraint_name
AND tc.table_name = kcu.table_name

LEFT JOIN information_schema.referential_constraints rc
ON tc.constraint_catalog = rc.constraint_catalog
AND tc.constraint_schema = rc.constraint_schema
AND tc.constraint_name = rc.constraint_name
AND tc.table_name = rc.table_name

WHERE tc.constraint_schema = 'my_db_name'

Hatta bu sütunlar hakkında daha fazla bilgi eklemek isteyebilirsiniz, bunu SQL'e ekleyin (ve istediğiniz sütunları seçin):

LEFT JOIN information_schema.COLUMNS c
ON kcu.constraint_schema = c.table_schema
AND kcu.table_name = c.table_name
AND kcu.column_name = c.column_name

-3

SEÇİN * USER_CONSTRAINTS WHERE TABLE_NAME = "tabnam";


1
Bu, bildiğim kadarıyla MySQL'de değil Oracle'da.
— Pradyumn
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.