Daftar Batasan dari Database MySQL


92

Bagaimana cara mendapatkan daftar semua batasan dari database tertentu?


1
Ada lebih dari satu jenis batasan di MySQL. Apa yang kamu maksud Bisakah Anda memberi contoh tentang hal-hal yang Anda cari?
Mark Byers

Jawaban:


146

Gunakan information_schema.table_constraintstabel untuk mendapatkan nama-nama batasan yang ditentukan pada setiap tabel:

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

Gunakan information_schema.key_column_usagetabel untuk mendapatkan kolom di masing-masing kendala tersebut:

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

Jika sebaliknya Anda berbicara tentang batasan kunci asing, gunakan information_schema.referential_constraints:

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

1
Daftar ini hanya akan menyertakan kendala UNIQUE, PRIMARY KEY, atau FOREIGN KEY. PERIKSA dimungkinkan, tetapi tidak diberlakukan. Batasan DEFAULT tidak akan terlihat menggunakan kueri ini.
OMG Ponies

MySQL tidak menyimpan kendala PERIKSA. Jika Anda mencoba untuk mendefinisikannya, program akan mem-parsing dan membuangnya secara diam-diam.
Bill Karwin

1
Nilai DEFAULT tidak dihitung sebagai batasan. Itu disimpan di information_schema.columns.column_default.
Bill Karwin

22

Jawaban bagus dari @Senseful.

Saya menyajikan kueri yang dimodifikasi untuk mereka yang hanya mencari daftar nama kendala (dan bukan detail / kolom lainnya):

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

2
jika Anda perlu menghapus satu setelah Anda menemukannya, lihat di sini stackoverflow.com/a/838412/2401804
r3wt

9

Ini sangat membantu jika Anda ingin melihat batasan kunci utama dan asing serta aturan seputar batasan tersebut seperti ON_UPDATE dan ON_DELETE serta nama kolom dan kolom asing secara bersamaan:

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'

Anda bahkan mungkin ingin menambahkan beberapa informasi lebih lanjut tentang kolom tersebut, cukup tambahkan ini ke dalam SQL (dan pilih kolom yang Anda inginkan):

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

PILIH * DARI USER_CONSTRAINTS DI MANA TABLE_NAME = "tabnam";


1
Ini ada di Oracle, bukan MySQL, sejauh yang saya tahu.
Pradyumn
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.