Chúng ta sẽ hiểu thêm về cách sử dụng mệnh đề “nếu không tồn tại” để tạo bảng trong bài viết này với sự trợ giúp của các ví dụ khác nhau
Cách chúng ta có thể tạo bảng bằng kỹ thuật “nếu không tồn tại”
Đầu tiên chúng ta sẽ mở MySQL trong terminal
$ sudo mysql
Hiển thị cơ sở dữ liệu chúng tôi có
HIỂN THỊ CƠ SỞ DỮ LIỆU;
Một danh sách tất cả các cơ sở dữ liệu sẽ được hiển thị, chúng tôi sẽ sử dụng shopping_mart_data
SỬ DỤNG shopping_mart_data;
Để liệt kê các bảng của cơ sở dữ liệu này, chúng ta sẽ chạy lệnh sau
HIỂN THỊ BẢNG;
Chúng tôi có một bảng có tên là Gocery_bill, trước tiên chúng tôi sẽ thử tạo một bảng có cùng tên
TẠO BẢNG Grocery_bill (Employee_Id INT, Employee_name VARCHAR(50));
Chúng ta có thể thấy một lỗi đã được tạo ra rằng “Bảng ‘Grocery_bill’ đã tồn tại”, bây giờ chúng ta sẽ chạy lệnh trên bằng cách sử dụng tùy chọn “nếu không tồn tại”
TẠO BẢNG nếu không tồn tại Grocery_bill (Employee_Id INT, Employee_name VARCHAR(50));
Lệnh chạy thành công nhưng chúng tôi đã thảo luận ở trên rằng không thể tạo hai bảng có cùng tên, vì vậy chúng tôi sẽ hiển thị lại các bảng của cơ sở dữ liệu để xác minh xem một bảng khác có được tạo hay không
HIỂN THỊ BẢNG;
Như vậy đã khẳng định rằng không thể tạo hai bảng có cùng tên và nếu chúng ta sử dụng “nếu không tồn tại”, nó sẽ chạy lệnh thành công mà không tạo ra lỗi nhưng sẽ không tạo bảng đã tồn tại với cùng một bảng . Bây giờ chúng ta sẽ tạo bảng bằng cách sử dụng lại mệnh đề “nếu không tồn tại” với một tên khác
TẠO BẢNG nếu không tồn tại Employee_data (Employee_Id INT, Employee_name VARCHAR(50));
Một bảng mới đã được tạo thành công để xác minh điều này một lần nữa hiển thị các bảng của cơ sở dữ liệu
HIỂN THỊ BẢNG;
Bảng đã được tạo vì không có bảng nào đã tồn tại với tên “Employee_data”
Phần kết luận
MySQL được nhiều công ty như Amazon và Twitter sử dụng vì các tính năng hiệu quả cao và các mệnh đề tích hợp khác nhau có thể đảm bảo hoàn thành các nhiệm vụ một cách dễ dàng. Trong MySQL tất cả dữ liệu được quản lý trong các bảng sau khi tạo, để tránh lỗi trùng bảng đã tồn tại chúng ta sử dụng mệnh đề “nếu không tồn tại” trong câu lệnh tạo bảng. Trong bài viết này, chúng ta đã thảo luận nếu mệnh đề “nếu không tồn tại” được sử dụng với câu lệnh “CREATE TABLE” thì nó sẽ thực thi lệnh thành công mà không tạo ra lỗi và chỉ tạo bảng nếu không có bảng nào khác có tên tương tự.
Tôi gặp phải một tình huống khó chịu khi câu lệnh ALTER TABLE không thành công do khóa ngoại không bị hủy trước đó. Điều này dẫn đến một số mâu thuẫn trong từ điển dữ liệu InnoDB (có thể là do http. // lỗi. mysql. com/lỗi. php?id=58215)
câu hỏi liên quan ở đây. https. // stackoverflow. com/questions/16857451/error-in-foreign-key-constraint-on-a-dropped-table
mysql> ALTER TABLE `visits` CHANGE COLUMN `variation_visitor_id` `variation_visitor_id` INT(11) NOT NULL ;Lỗi khi đổi tên của '. /db/#sql-482c_8448f' thành '. /db/lượt truy cập' (không. 150)
mysql> SHOW ENGINE INNODB STATUS; Error in foreign key constraint of table db/visits: FOREIGN KEY (`variation_visitor_id`) REFERENCES `variations_visitors` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION ) ENGINE=InnoDB DEFAULT CHARSET=utf8 Cannot find an index in the referenced table where the referenced columns appear as the first columns, or column types in the table and the referenced table do not match for constraint. Note that the internal storage type of ENUM and SET changed in tables created with >= InnoDB-4.1.12, and such columns in old tables cannot be referenced by such columns in new tables. See //dev.mysql.com/doc/refman/5.5/en/innodb-foreign-key-constraints.html for correct foreign key definitippon.Vì tôi không thể khôi phục bảng #sql-482c_8448f để truy cập, tôi quyết định nhập lại bảng từ bản sao lưu được thực hiện ngay trước khi thay đổi. Tuy nhiên điều này không thành công. Đang điều tra
- Ràng buộc đã bị xóa khỏi INFORMATION_SCHEMA. TABLE_CONSTRAINTS và INFORMATION_SCHEMA. SỐ LIỆU THỐNG KÊ
- Nhưng ràng buộc vẫn hiển thị trong INFORMATION_SCHEMA. INNODB_SYS_FOREIGN;
- Bảng không tồn tại nên tôi không thể xóa khóa ngoại
- Tôi không thể tạo bảng mà không có lỗi
SQL/Lỗi
mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_FOREIGN WHERE ID='db/fk_visits_variations_visitors1'; +-----------------------------------+-----------+------------------------+--------+------+ | ID | FOR_NAME | REF_NAME | N_COLS | TYPE | +-----------------------------------+-----------+------------------------+--------+------+ | db/fk_visits_variations_visitors1 | db/visits | db/variations_visitors | 1 | 48 | +-----------------------------------+-----------+------------------------+--------+------+Cố gắng tạo lại bảng mà không có khóa ngoại gây ra lỗi 150
mysql> SET UNIQUE_CHECKS = 0; SET FOREIGN_KEY_CHECKS = 0; CREATE TABLE `visits` ( `id` INT(11) NOT NULL AUTO_INCREMENT , `variation_visitor_id` INT(11) NOT NULL , PRIMARY KEY (`id`), ) ENGINE=InnoDB DEFAULT CHARSET=utf8; SET FOREIGN_KEY_CHECKS = 1; SET UNIQUE_CHECKS = 1; ERROR 1005 (HY000) at line 26: Can't create table 'db.visits' (errno: 150) mysql> SHOW ENGINE INNODB STATUS; Error in foreign key constraint of table db/visits: there is no index in the table which would contain the columns as the first columns, or the data types in the table do not match the ones in the referenced table or one of the ON .. SET NULL columns is declared NOT NULL. Constraint: , CONSTRAINT "fk_visits_variations_visitors1" FOREIGN KEY ("variation_visitor_id") REFERENCES "variations_visitors" ("id") ON DELETE NO ACTION ON UPDATE NO ACTIONCố gắng tạo nó gây ra lỗi 121
mysql> SET UNIQUE_CHECKS = 0; SET FOREIGN_KEY_CHECKS = 0; CREATE TABLE `visits` ( `id` INT(11) NOT NULL AUTO_INCREMENT , `variation_visitor_id` INT(11) NOT NULL , PRIMARY KEY (`id`), KEY `fk_visits_variations_visitors1` (`variation_visitor_id`), CONSTRAINT `fk_visits_variations_visitors1` FOREIGN KEY (`variation_visitor_id`) REFERENCES `variations_visitors` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION ) ENGINE=InnoDB DEFAULT CHARSET=utf8; SET FOREIGN_KEY_CHECKS = 1; SET UNIQUE_CHECKS = 1; ERROR 1005 (HY000) at line 26: Can't create table 'db.visits' (errno: 121) mysql> SHOW ENGINE INNODB STATUS; Error in foreign key constraint creation for table `db`.`visits`. A foreign key constraint of name `db`.`fk_visits_variations_visitors1` already exists. (Note that internally InnoDB adds 'databasename' in front of the user-defined constraint name.) Note that InnoDB's FOREIGN KEY system tables store constraint names as case-insensitive, with the MySQL standard latin1_swedish_ci collation. If you create tables or databases whose names differ only in > the character case, then collisions in constraint names can occur. Workaround: name your constraints explicitly with unique names.Cuối cùng, tôi đã sử dụng một tên khóa ngoại mới. Tôi không mong đợi điều này hoạt động nhưng nó cho phép tạo bảng
mysql> SET UNIQUE_CHECKS = 0; SET FOREIGN_KEY_CHECKS = 0; CREATE TABLE `visits` ( `id` INT(11) NOT NULL AUTO_INCREMENT , `variation_visitor_id` INT(11) NOT NULL , PRIMARY KEY (`id`), KEY `fk_visits_variations_visitors2` (`variation_visitor_id`), CONSTRAINT `fk_visits_variations_visitors2` FOREIGN KEY (`variation_visitor_id`) REFERENCES `variations_visitors` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION ) ENGINE=InnoDB DEFAULT CHARSET=utf8; SET FOREIGN_KEY_CHECKS = 1; SET UNIQUE_CHECKS = 1;Chỉ cần xóa bảng sau khi xóa bản ghi sai trong INFORMATION_SCHEMA. INNODB_SYS_FOREIGN, cho phép nhập với tên khóa ngoại ban đầu