web-dev-qa-db-ja.com

MySQLに空の文字列が挿入されないようにするための制約

この質問 では、NULL値の挿入を防ぐ方法を学びました。しかし、残念ながら、とにかく空の文字列が挿入されています。 PHP側でこれを防ぐこととは別に、これを防ぐためにデータベース制約のようなものを使用したいのですが、もちろんアプリケーション側でのチェックが必要ですが、それが欲しいです両側にいること。

どのアプリケーションがデータベースと通信していても、基本的に間違ったデータをデータベースに挿入できないようにする必要があると教えられています。そう...

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

それでも私はこの挿入を行うことができます:

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

防止したいのですが。

32
Whakkee

通常、これはCHECK制約を使用して行います。

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

残念ながら、MySQLは制約のサポートが制限されています。 MySQLリファレンスマニュアル から:

CHECK句は解析されますが、すべてのストレージエンジンで無視されます。

人々が指摘しているように、回避策として triggers を使用する必要があるのはそのためです。

将来的には、 PostgreSQL を確認することをお勧めします。PostgreSQL(-===-)は、 その他のもの多くの人 .

20
jholster

トリガーを使用して、空白文字列の挿入を防ぐことができます。

速くはなく、簡潔でもきれいでもありませんが...

例:

  1. テーブルを作成します。

    mysql> create table yar (val VARCHAR(25) not null);
    Query OK, 0 rows affected (0.02 sec)
    
  2. 'before insert'トリガーを作成して、空白文字列をチェックし、許可しないようにします。

    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. Nullとblankstringを列に挿入してみてください。

    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)
    
12
kpower