0

csv からデータベースにエクスポートされたブラインド値を挿入しようとしています。プロセス中に、警告を表示することさえせずに、私が与えるものを挿入しています。

例:私は以下のようなテーブル構造を持っています

  #   column-name     type
  --   ---            ----
  1   id             int(11)
  2   name           varchar(32)
  3   bool           tinyint(1)

挿入クエリ:

INSERT INTO `table_name` (`id`, `name`, `bool`) VALUES ('a', '11111', 'abced');

上記のクエリを実行しようとすると、行が挿入されますが、警告が表示されます..正しい方法ではないことを理解している解決策を見つけました。

私の試み

INSERT INTO `table_name` (`id`, `name`, `bool`) VALUES ('a', '11111', 'abced');

php

$warningCount = count fetched after executing the query "SELECT @@warning_count"
if($WarningCount > 0){ DELETE THE ROW INSERTED and ECHO error Message}
4

1 に答える 1

1

SQL モードを STRICT_ALL_TABLES に設定してみてください。

mysql> set @@session.sql_mode = STRICT_ALL_TABLES;
Query OK, 0 rows affected (0.00 sec)

mysql> create table t14 (id integer, name varchar(32), bool tinyint(1));
Query OK, 0 rows affected (0.05 sec)

mysql> insert into t14 set id=1, name="test", bool="bla";
ERROR 1366 (HY000): Incorrect integer value: 'bla' for column 'bool' at row 1

MySQLのドキュメントには次のように記載されています。

すべてのストレージ エンジンに対して厳密モードを有効にします。無効なデータ値は拒否されます。追加の詳細は次のとおりです。

Strict モードは、MySQL が INSERT や UPDATE などのデータ変更ステートメントで無効な値または欠落している値を処理する方法を制御します。値が無効になる理由はいくつかあります。たとえば、列のデータ型が間違っているか、範囲外である可能性があります。

次に、トランザクションに挿入します。失敗した挿入クエリはカウントされません。MySQL トランザクションは、「オール オア ナッシング」ルールの意味で完全にアトミックではないことに注意してください。ステートメントの半分が完了し、残りの半分が失敗したトランザクションをコミットできます。

于 2013-11-05T14:16:46.487 に答える