4

私はこれを数回見ました。他の値を次のように指定せずに、いくつかの値を挿入できるサーバーが 1 つありますINSERT INTO table SET value_a='a', value_b='b';(value_c はデフォルト値が設定されていないフィールドですが、ここでは問題なく動作します)。スクリプトが新しいサーバーに移動されると、デフォルト以外の値をすべて指定するクエリが必要になるため、一部の INSERT クエリが中断し、デフォルト以外の値を指定しないという最初の発生に対して次のエラーが発生します。

#1364 - Field 'value_c' doesn't have a default value

テーブルのデフォルト値を設定すると、他の領域の機能が損なわれる可能性があります。ここで何が起こっているのか正確に知りたいです。

4

2 に答える 2

15

サーバーの1つはデフォルトで厳密モードで実行されており、もう1つは実行されていません。サーバーが厳密モードで実行されている場合(または接続でサーバーを設定している場合)、NOT NULLとして定義されている列にNULL値を挿入しようとすると、#1364エラーが発生します。strictモードがないと、NULL値は空の文字列または0に置き換えられます。

例:

CREATE TABLE `test_tbl` (
 `id` int(11) NOT NULL,
 `someint` int(11) NOT NULL,
 `sometext` varchar(255) NOT NULL,
 `somedate` datetime NOT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

SET sql_mode = '';
INSERT INTO test_tbl(id) VALUES(1);
SELECT * FROM test_tbl;
+----+---------+----------+---------------------+
| id | someint | sometext | somedate            |
+----+---------+----------+---------------------+
|  1 |       0 |          | 0000-00-00 00:00:00 |
+----+---------+----------+---------------------+
SET sql_mode = 'STRICT_ALL_TABLES';
INSERT INTO test_tbl(id) VALUES(2);
#1364 - Field 'someint' doesn't have a default value 
于 2011-05-31T23:29:11.367 に答える
1
INSERT INTO table SET value_a='a', value_b='b'

次のクエリを実行します。

次の表

TABLE `table`
    a varchar
    b varchar
    c varchar NOT NULL -- column is listed as NOT NULL !

そして、あなたはそれに次のクエリを実行しています

INSERT INTO `table` (a,b,c) VALUES ('a', 'b', null)

したがって、デフォルト値がリストされていない列にnull値を挿入しようとしています。not nullこれがエラーが発生する理由です。

しかし、なぜサーバーAではなくサーバーBでこのエラーが発生するのですか?

考えられる理由は次のとおりです。

  1. createtableステートメントは同じではありませんshow create table table1。各サーバーでaを実行し、出力を注意深く比較します。
  2. 挿入している入力を変更しているbefore insertトリガーがサーバーAには存在しますが、サーバーBには存在しません(またはその逆)。各サーバーでを実行show triggers in databasexし、出力を比較します。
  3. サーバーAのテーブルは、サーバーBとは異なるエンジンを使用しています。これは、の出力にshow create table最後の行として表示されます。ENGINE=MyISAM

参照:http ://dev.mysql.com/doc/refman/5.0/en/show-triggers.html
http://dev.mysql.com/doc/refman/5.0/en/show-create-table.html

于 2011-05-31T23:19:55.173 に答える