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.