Rất tiếc, MySQL không hỗ trợ các ràng buộc kiểm tra SQL. Bạn có thể xác định chúng trong truy vấn DDL của bạn vì lý do tương thích nhưng chúng chỉ bị bỏ qua.
Có một lựa chọn đơn giản
Bạn có thể tạo BEFORE INSERT
và BEFORE UPDATE
trigger mà một trong hai gây ra một lỗi hoặc thiết lập hiện trường để giá trị mặc định của nó khi các yêu cầu của dữ liệu không được đáp ứng.
Ví dụ cho BEFORE INSERT
làm việc kể từ MySQL 5,5
DELIMITER $$
CREATE TRIGGER `test_before_insert` BEFORE INSERT ON `Test`
FOR EACH ROW
BEGIN
IF CHAR_LENGTH(NEW.ID) < 4 THEN
SIGNAL SQLSTATE '12345'
SET MESSAGE_TEXT := 'check constraint on Test.ID failed';
END IF;
END$$
DELIMITER ;
Trước MySQL 5,5 bạn phải gây ra lỗi, ví dụ gọi một thủ tục không xác định.
Trong cả hai trường hợp, điều này gây ra một cuộn ngược giao dịch tiềm ẩn. MySQL không cho phép chính câu lệnh ROLLBACK trong các thủ tục và trình kích hoạt.
Nếu bạn không muốn khôi phục giao dịch (INSERT/UPDATE nên chuyển ngay cả với "ràng buộc kiểm tra" không thành công, bạn có thể ghi đè giá trị bằng cách sử dụng SET NEW.ID = NULL
sẽ đặt id thành giá trị mặc định của trường, không thực sự có ý nghĩa cho một id tho
Chỉnh sửa: Đã xóa báo giá đi lạc.
Liên quan đến việc điều hành :=
:
Không giống như =
, các nhà điều hành :=
không bao giờ được hiểu như là một toán tử so sánh. Điều này có nghĩa là bạn có thể sử dụng :=
trong bất kỳ câu lệnh SQL hợp lệ nào (không chỉ trong các câu lệnh SET) để gán một giá trị cho một biến.
https://dev.mysql.com/doc/refman/5.6/en/assignment-operators.html
Về trích dẫn nhận dạng backtick:
Nhân vật nhận dạng trích dẫn là backtick (“`”)
Nếu chế độ ANSI_QUOTES SQL được kích hoạt, nó cũng được phép để trích dẫn số nhận dạng trong dấu ngoặc kép đôi
http://dev.mysql.com/doc/refman/5.6/en/identifiers.html
Đồng ý một phần. Cho rằng bạn đã cố gắng sử dụng nó, nó có thể được giả định rằng bạn đã hỏi cả hai câu hỏi. Trong thực tế, câu trả lời bạn đã chấp nhận chủ yếu là giải thích lý do tại sao nó không hoạt động. – igorrs
Bạn có thể bỏ phiếu cho yêu cầu tính năng này: http://bugs.mysql.com/bug.php?id=3464 nhưng nó không nhận được bất kỳ sự chú ý nào trong một thập kỷ. –
Tôi muốn biết lý do xóa phiếu bầu đối với câu hỏi này. – nhahtdh