Làm thế nào để tìm thấy sự phụ thuộc vào một bảng trong mysql 5.0?


7

Tôi đang cố gắng bỏ một bảng trong MySQL nhưng nó phàn nàn về "Không thể xóa hoặc cập nhật hàng cha mẹ: một ràng buộc khóa ngoại không thành công" ...

Câu hỏi

  • Có cách nào để tìm ra tất cả các phụ thuộc bảng và các đối tượng phụ thuộc vào nó không?
  • Đối với Sybase, DBArtisan cung cấp một cách thực sự dễ dàng để tìm các phụ thuộc. Có công cụ nào như vậy cho MySQL không?

Câu trả lời:


5

Từ MySQL 5.0 trở đi, một nơi bạn có thể kiểm tra là information_schema.table_constraint

Ví dụ: để lấy số lượng mối quan hệ khóa ngoài cho một bảng đã cho (mydb.mytable), hãy chạy này:

SELECT COUNT(1) FROM information_schema.table_constraints
WHERE table_schema = 'mydb'
AND table_name = 'mytable'
AND constraint_type='FOREIGN KEY';

Từ MySQL 5.1 trở đi, bạn cũng có thể sử dụng information_schema.referential_constraint . Đây là cách bố trí bảng:

mysql> show create table information_schema.referential_constraints\G
*************************** 1. row ***************************
       Table: REFERENTIAL_CONSTRAINTS
Create Table: CREATE TEMPORARY TABLE `REFERENTIAL_CONSTRAINTS` (
  `CONSTRAINT_CATALOG` varchar(512) DEFAULT NULL,
  `CONSTRAINT_SCHEMA` varchar(64) NOT NULL DEFAULT '',
  `CONSTRAINT_NAME` varchar(64) NOT NULL DEFAULT '',
  `UNIQUE_CONSTRAINT_CATALOG` varchar(512) DEFAULT NULL,
  `UNIQUE_CONSTRAINT_SCHEMA` varchar(64) NOT NULL DEFAULT '',
  `UNIQUE_CONSTRAINT_NAME` varchar(64) DEFAULT NULL,
  `MATCH_OPTION` varchar(64) NOT NULL DEFAULT '',
  `UPDATE_RULE` varchar(64) NOT NULL DEFAULT '',
  `DELETE_RULE` varchar(64) NOT NULL DEFAULT '',
  `TABLE_NAME` varchar(64) NOT NULL DEFAULT '',
  `REFERENCED_TABLE_NAME` varchar(64) NOT NULL DEFAULT ''
) ENGINE=MEMORY DEFAULT CHARSET=utf8
1 row in set (0.01 sec)

Chỉ cần kiểm tra các cột tên_bảng và tham chiếu_table_name.


1

Bạn có thể sử dụng Toad cho MySQL , miễn phí. Với Toad, bạn có thể tạo sơ đồ ER trực quan và tìm các phụ thuộc của mình.


0

Tôi đã thử nghiệm giải pháp này trên 5.5, nhưng nó cũng sẽ hoạt động từ 5.1 trở đi.

Truy vấn này có thể hiển thị cho bạn tất cả các tham chiếu đến bảng của bạn:

Chỉ cần nhớ thay thế 'mydb' và 'mytable' bằng những cái bạn cần. Cũng có thể định nghĩa đây là XEM cho các mục đích sử dụng trong tương lai.

SELECT rc.`CONSTRAINT_CATALOG`   AS `ChildTable_Catalog`
, rc.`CONSTRAINT_SCHEMA`         AS `ChildTable_Schema`
, rc.`TABLE_NAME`                AS `ChildTable`
, rc.`CONSTRAINT_NAME`           AS `ChildTable_ForeignKey`
, GROUP_CONCAT(DISTINCT fk.`COLUMN_NAME` ORDER BY fk.`ORDINAL_POSITION` ASC) AS `ChildTable_ForeignKey_Columns`
, rc.`UNIQUE_CONSTRAINT_CATALOG` AS `ParentTable_Catalog`
, rc.`UNIQUE_CONSTRAINT_SCHEMA`  AS `ParentTable_Schema`
, rc.`REFERENCED_TABLE_NAME`     AS `Parent_Table`
, rc.`UNIQUE_CONSTRAINT_NAME`    AS `ParentTable_UniqueKey`
, GROUP_CONCAT(DISTINCT uk.`COLUMN_NAME` ORDER BY fk.`ORDINAL_POSITION` ASC) AS `ParentTable_UniqueKey_Columns`
-- constraint relation
FROM INFORMATION_SCHEMA.`REFERENTIAL_CONSTRAINTS` AS rc
-- foreign key 
INNER JOIN INFORMATION_SCHEMA.`KEY_COLUMN_USAGE` AS fk 
    ON rc.`CONSTRAINT_CATALOG`        = fk.`CONSTRAINT_CATALOG`
   AND rc.`CONSTRAINT_SCHEMA`         = fk.`CONSTRAINT_SCHEMA`
   AND rc.`TABLE_NAME`                = fk.`TABLE_NAME`
   AND rc.`CONSTRAINT_NAME`           = fk.`CONSTRAINT_NAME`
-- unique key
INNER JOIN INFORMATION_SCHEMA.`KEY_COLUMN_USAGE` AS uk 
    ON rc.`UNIQUE_CONSTRAINT_CATALOG` = uk.`CONSTRAINT_CATALOG`
   AND rc.`UNIQUE_CONSTRAINT_SCHEMA`  = uk.`CONSTRAINT_SCHEMA`
   AND rc.`REFERENCED_TABLE_NAME`     = uk.`TABLE_NAME`
   AND rc.`UNIQUE_CONSTRAINT_NAME`    = uk.`CONSTRAINT_NAME`
-- optional filter condition
WHERE rc.`UNIQUE_CONSTRAINT_SCHEMA` = 'mydb'
  AND rc.`REFERENCED_TABLE_NAME`    = 'mytable'
-- necessary grouping parameters
GROUP BY rc.`CONSTRAINT_CATALOG`
, rc.`CONSTRAINT_SCHEMA` 
, rc.`TABLE_NAME`
, rc.`CONSTRAINT_NAME`
, rc.`UNIQUE_CONSTRAINT_CATALOG`
, rc.`UNIQUE_CONSTRAINT_SCHEMA`
, rc.`REFERENCED_TABLE_NAME`
, rc.`UNIQUE_CONSTRAINT_NAME`
-- optional ordering parameters
ORDER BY rc.`CONSTRAINT_CATALOG` ASC
, rc.`CONSTRAINT_SCHEMA` ASC
, rc.`REFERENCED_TABLE_NAME` ASC
, rc.`TABLE_NAME` ASC
;

0

Bạn có thể sử dụng điều này để tìm kiếm khóa ngoại của bạn và Target_Table. Tất cả bạn cần là thay đổi mệnh đề where để tìm khóa cụ thể của bạn.

select distinct ref.referenced_table_name Source_Table,
                tab.constraint_name,
                tab.constraint_type,
                tab.table_name  Target_Table
from information_schema.table_constraints tab,
     information_schema.referential_constraints ref
where tab.constraint_name = ref.constraint_name;

0

Cũng sử dụng khi bạn muốn biết bảng phụ trợ nào tham chiếu FK của bảng.

SELECT
TABLE_NAME,COLUMN_NAME,CONSTRAINT_NAME, REFERENCED_TABLE_NAME,REFERENCED_COLUMN_NAME
FROM
INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE
REFERENCED_TABLE_NAME = 'your_table_name';
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.