31

この質問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 ('');

これを防ぎたい。


  • 私はあなたが空の文字列を防ぐことの必要性を見ることができ、私も間違ったデータがデータベースレベルで挿入されるのを防ぐように教えられました。しかし、経験上、制約の複雑さに基づいて慎重に費用対効果を判断する必要があることがわかりました。一部の制約はアプリケーションレベルで表現するのが簡単ですが、データベースレベルでは非常に面倒になることがあります。さらに悪いことに、彼らはあなたがそれをやり過ぎるとデータベースベンダーにあなたを完全に閉じ込める傾向があります。ちょうど私の0.02ドル。 - Stijn de Witt
  • 空の文字列はnullと同じではないため、とにかく'はありません。それについて。 - user207421

2 답변


20

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

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

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

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

それがあなたが使わなければならない理由ですトリガー人々が指摘したように、回避策として。

将来的には、PostgreSQLを見てください。これは、データの整合性をより適切にサポートしていると考えられています。他のものによって多くの人


  • だから... OracleでNOT NULL制約によって処理されるもの、MySQLではNOT NULL制約と2つのトリガ(更新前と挿入前)が必要です。そして、この質問によると、私がエラーを投げるのが好きならハッキングする:stackoverflow.com/questions/24。 PostgreSQLを見るためのアドバイスは、ここで最高のアドバイスかもしれません!ありがとうございます。 - Whakkee
  • PostgreSQLにも独自の制限があります。しかし、(最初に学んだ)PHP / MySQLの世界の外に出たことがない人はたくさんいます。そのため、不足しているものを見つけるために少なくとも1回は新鮮な空気を吸うことをお勧めします。それでも欲しいのなら戻ってください;-) - jholster
  • MariaDBで利用可能なCHECK CONSTRAINTのサポート10.2.1MDEV-7563) - Samuel Harmer

10

空白文字列の挿入を防ぐためにトリガを使うことができます。

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

例:

  1. あなたのテーブルを作成します。

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

    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と空白文字列を挿入してみます。

    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)
    

リンクされた質問


関連する質問

最近の質問