Hướng dẫn stop insert trigger mysql - dừng chèn kích hoạt mysql

Tôi muốn tạo ra một kích hoạt sẽ ngăn chặn việc chèn nếu ngày sinh (một trong các cột) trong tương lai. Tôi có cái này:

CREATE TRIGGER foo
BEFORE INSERT ON table
FOR EACH ROW
BEGIN
  IF NEW.birthdate > CURRENT_DATE()
  THEN
    //How do I prevent the insert right here???
  END IF;
END;

Làm thế nào tôi có thể hủy chèn bên trong câu lệnh IF?

Hướng dẫn stop insert trigger mysql - dừng chèn kích hoạt mysql

Đã hỏi ngày 5 tháng 6 năm 2010 lúc 20:18Jun 5, 2010 at 20:18

1

Ví dụ 1, MySQL, bạn có thể hủy chèn vào kích hoạt với mysql> create table yar (val VARCHAR(25) not null); Query OK, 0 rows affected (0.02 sec) 2

  1. Tạo bảng của bạn bằng cột varchar:

    mysql> create table yar (val VARCHAR(25) not null);
    Query OK, 0 rows affected (0.02 sec)
    
  2. Tạo kích hoạt 'trước khi chèn' của bạn để kiểm tra một điều kiện và không cho phép.

    mysql> delimiter $$
    mysql> create trigger foo before insert on yar
        -> for each row
        -> begin
        -> if new.val = '' then
        -> signal sqlstate '45000';
        -> end if;
        -> end;$$
    Query OK, 0 rows affected (0.01 sec)
    
  3. Cố gắng chèn nơi điều kiện được đáp ứng:

    mysql> delimiter ;
    
    mysql> insert into yar values("");
    ERROR 1644 (45000): Unhandled user-defined exception condition
    
    mysql> insert into yar values ("abc");
    Query OK, 1 row affected (0.01 sec)
    
    mysql> select * from yar;
    +-----+
    | val |
    +-----+
    | abc |
    +-----+
    1 row in set (0.00 sec)
    

Bạn đã chèn một chuỗi trống, bộ kích hoạt thấy nó trống và tăng tín hiệu để ngăn chặn phần chèn.

Ví dụ 2, MySQL, hủy chèn vào kích hoạt bằng cách khiến dữ liệu vi phạm một ràng buộc không null.

  1. Tạo bảng của bạn bằng cột varchar:

    mysql> create table yar (val VARCHAR(25) not null);
    Query OK, 0 rows affected (0.02 sec)
    
  2. Tạo kích hoạt 'trước khi chèn' của bạn để kiểm tra một điều kiện và không cho phép.

    mysql> delimiter $$
    mysql> create trigger foo before insert on yar
        -> for each row
        -> begin
        -> if new.val = '' then
        -> set new.val = NULL;
        -> end if;
        -> end;$$
    Query OK, 0 rows affected (0.01 sec)
    
  3. Cố gắng chèn nơi điều kiện được đáp ứng:

    mysql> delimiter ;
    
    mysql> insert into yar values("");
    ERROR 1048 (23000): Column 'val' cannot be null
    
    mysql> insert into yar values ("abc");
    Query OK, 1 row affected (0.01 sec)
    
    mysql> select * from yar;
    +-----+
    | val |
    +-----+
    | abc |
    +-----+
    1 row in set (0.00 sec)
    

Bạn đã chèn một chuỗi trống, bộ kích hoạt thấy nó trống và tăng tín hiệu để ngăn chặn phần chèn.

Ví dụ 2, MySQL, hủy chèn vào kích hoạt bằng cách khiến dữ liệu vi phạm một ràng buộc không null.Mar 18, 2014 at 19:37

Hướng dẫn stop insert trigger mysql - dừng chèn kích hoạt mysql

Bạn đã chèn một chuỗi trống, bộ kích hoạt thấy nó trống và thay đổi giá trị thành null, do đó, phần chèn được ngăn chặn.Eric Leschinski

Đã trả lời ngày 18 tháng 3 năm 2014 lúc 19:3793 gold badges406 silver badges331 bronze badges

2

Eric Leschinskieric Leschinski

SIGNAL SQLSTATE '45000' 
SET MESSAGE_TEXT = "your error text";

141K93 Huy hiệu vàng406 Huy hiệu bạc331 Huy hiệu Đồng

Hướng dẫn stop insert trigger mysql - dừng chèn kích hoạt mysql

Tôi không biết có đến muộn nhưng bạn có thể làm điều đó ngay bây giờ:Jul 24, 2015 at 14:53

Hướng dẫn stop insert trigger mysql - dừng chèn kích hoạt mysql

2

DELIMITER $$
CREATE TRIGGER foo
BEFORE INSERT ON table
FOR EACH ROW
BEGIN
  IF NEW.birthdate > CURRENT_DATE()
  THEN
   SIGNAL SQLSTATE '02000' SET MESSAGE_TEXT = 'Warning: birthdate can not be greater than current date!';
  END IF;

END$$
    DELIMITER ;

P.S. Đừng quên sửa đổi dấu phân cách trước và sau khi kích hoạt ...Jun 26, 2017 at 8:39

0

Đã trả lời ngày 24 tháng 7 năm 2015 lúc 14:53

Đã trả lời ngày 26 tháng 6 năm 2017 lúc 8:39

Dựa trên điều này, tôi không chắc liệu có thể làm theo cách đó không.

Không có sự hỗ trợ nào trong việc triển khai các kích hoạt hiện tại của MySQL để tự nguyện ném một ngoại lệ và hủy bỏ tuyên bố sinh ra kích hoạt.Jun 5, 2010 at 20:25

Cách giải quyết mà tôi đã tìm thấy là viết một trình kích hoạt trước để đặt một trong các cột không khống trong bảng thành NULL, do đó vi phạm ràng buộc không khống của nó. Điều này làm cho tuyên bố sinh ra kích hoạt bị hủy bỏ.Rich Adams

Đã trả lời ngày 5 tháng 6 năm 2010 lúc 20:254 gold badges39 silver badges62 bronze badges

1

Adamsrich Adamsrich Adams

CREATE TABLE Users
           (
             UserName varchar(15) NOT NULL PRIMARY KEY,
             Password varchar(15) NOT NULL,
             Active Bool DEFAULT TRUE,
             CHECK (CHAR_LENGTH(UserName)>3)
           )

25.6K4 Huy hiệu vàng39 Huy hiệu bạc62 Huy hiệu Đồng

Tôi đã từng gặp vấn đề tương tự. Tôi đã tạo một bảng nhưng không có cách nào để gán độ dài tối thiểu của chuỗi trong MySQL. Tôi đã tạo bảng như sau:

mysql> create table yar (val VARCHAR(25) not null);
Query OK, 0 rows affected (0.02 sec)
0

Nhưng chức năng kiểm tra không hoạt động trên chèn.

mysql> create table yar (val VARCHAR(25) not null);
Query OK, 0 rows affected (0.02 sec)
1

Vì vậy, tôi đã thay đổi bảng của mình như sau:Feb 21, 2013 at 13:09

Hướng dẫn stop insert trigger mysql - dừng chèn kích hoạt mysql

Sau đó, tạo một kích hoạt:MJBZA

Đã trả lời ngày 21 tháng 2 năm 2013 lúc 13:096 gold badges42 silver badges93 bronze badges

Mjbzamjbza

4.6206 Huy hiệu vàng42 Huy hiệu bạc93 Huy hiệu Đồng

Vấn đề được mô tả trong câu hỏi nghe có vẻ là một ứng cử viên hoàn hảo cho một ràng buộc kiểm tra - thêm dòng này vào định nghĩa bảng.Aug 11, 2010 at 8:38

KIỂM TRA BROAD_IN_THE_PAST (BirthdateMaHuJa

Đã trả lời ngày 11 tháng 8 năm 2010 lúc 8:381 gold badge16 silver badges6 bronze badges

1