2010-03-25 31 views
27

Ok, trong this question Tôi đã học cách ngăn chặn việc chèn giá trị NULL. Nhưng, thật không may, một chuỗi rỗng đang được chèn vào anyway. Ngoài việc ngăn chặn điều này ở phía PHP, tôi muốn sử dụng một cái gì đó giống như một ràng buộc cơ sở dữ liệu để ngăn chặn điều này. Tất nhiên một kiểm tra về phía ứng dụng là cần thiết, nhưng tôi muốn nó được ở cả hai bên.Tôi đang tìm một ràng buộc để ngăn việc chèn một chuỗi rỗng vào MySQL

Tôi được dạy rằng bất kỳ ứng dụng nào đang nói chuyện với cơ sở dữ liệu của bạn, nó sẽ không thể chèn dữ liệu sai về cơ bản trong đó. Vì vậy, ...

CREATE TABLE IF NOT EXISTS tblFoo (
    foo_id int(11) NOT NULL AUTO_INCREMENT, 
    foo_test varchar(50) NOT NULL, 
    PRIMARY KEY (foo_id) 
); 

vẫn sẽ cho phép tôi làm chèn này:

INSERT INTO tblFoo (foo_test) VALUES (''); 

Mà tôi muốn ngăn chặn.

+3

Tôi có thể thấy nhu cầu của bạn để ngăn chặn các chuỗi rỗng và tôi cũng được dạy để ngăn chặn dữ liệu sai được chèn vào ở cấp cơ sở dữ liệu. Nhưng kinh nghiệm đã dạy tôi rằng bạn cần thực hiện một phán quyết chi phí/lợi ích cẩn thận dựa trên sự phức tạp của ràng buộc. Một số ràng buộc đơn giản để thể hiện ở cấp ứng dụng nhưng có thể trở nên rất cồng kềnh ở cấp cơ sở dữ liệu. Tệ hơn nữa, họ có xu hướng hoàn toàn khóa bạn vào một nhà cung cấp cơ sở dữ liệu nếu bạn lạm dụng nó. Chỉ cần $ 0,02 của tôi. –

Trả lời

15

Thông thường bạn sẽ làm điều đó với ràng buộc kiểm tra:

foo_test VARCHAR(50) NOT NULL CHECK (foo_test <> '') 

Thật không may MySQL có hỗ trợ giới hạn cho ràng buộc. Từ MySQL Reference Manual:

Điều khoản CHECK được phân tích cú pháp nhưng bị bỏ qua bởi tất cả các công cụ lưu trữ.

Đó là lý do tại sao bạn phải sử dụng triggers làm cách giải quyết, như mọi người đã chỉ ra.

Trong tương lai, bạn có thể muốn take a look at PostgreSQL, được coi là có hỗ trợ tốt hơn cho toàn vẹn dữ liệu (trong số other things) bởi many people.

+1

Vì vậy, những gì trong oracle được xử lý bởi một ràng buộc NOT NULL, cần một ràng buộc NOT NULL và hai trigger (trước khi cập nhật và trước khi chèn) trong MySQL. Và một số hack nếu tôi thích một lỗi được ném, theo câu hỏi này: http: // stackoverflow.com/questions/24. Lời khuyên để xem PostgreSQL có thể là lời khuyên tốt nhất ở đây! Cảm ơn! – Whakkee

+2

PostgreSQL cũng có những hạn chế riêng. Tuy nhiên, có rất nhiều người không bao giờ bước ra ngoài thế giới PHP/MySQL (được học đầu tiên) của họ, người mà tôi thực sự khuyên bạn nên hít thở không khí trong lành ít nhất một lần để tìm ra những gì họ đang thiếu. Sau đó quay trở lại nếu bạn vẫn muốn ;-) – jholster

+0

Hỗ trợ cho CHECK CONSTRAINT có sẵn trong MariaDB từ [10.2.1] (https://mariadb.com/kb/en/mariadb/mariadb-1021-release-notes/) ([ MDEV-7563] (https://jira.mariadb.org/browse/MDEV-7563)). –

7

Bạn có thể sử dụng trình kích hoạt để ngăn chèn chuỗi trống.

Nó không nhanh, không phải là rất súc tích và không đẹp, nhưng ...

Ví dụ:

  1. Tạo bảng của bạn:

    mysql> create table yar (val VARCHAR(25) not null); 
    Query OK, 0 rows affected (0.02 sec) 
    
  2. Tạo của bạn 'trước chèn 'trình kích hoạt để kiểm tra chuỗi trống 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) 
    
    mysql> delimiter ; 
    
  3. Cố gắng chèn vô blankstring vào cột của bạn:

    mysql> insert into yar values(""); 
    ERROR 1644 (45000): Unhandled user-defined exception condition 
    
    mysql> insert into yar values(NULL); 
    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) 
    
Các vấn đề liên quan