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.