私はこのSQLを初めて使用します。はるかに大きなプログラムで同様の質問を見てきましたが、現時点では理解できません。ホームページで使用するカードゲームのデータベースを作成しています。
WindowsでMySQL Workbenchを使用しています。私が得るエラーは次のとおりです:
エラーコード:1364。フィールド 'id'にはデフォルト値がありません
CREATE TABLE card_games
(
nafnleiks varchar(50),
leiklysing varchar(3000),
prentadi varchar(1500),
notkunarheimildir varchar(1000),
upplysingar varchar(1000),
ymislegt varchar(500),
id int(11) PK
);
insert into card_games (nafnleiks, leiklysing, prentadi, notkunarheimildir, upplysingar, ymislegt)
values('Svartipétur',
'Leiklýsingu vantar',
'Er prentað í: Þórarinn Guðmundsson (2010). Spilabókin - Allir helstu spilaleikir og spil.',
'Heimildir um notkun: Árni Sigurðsson (1951). Hátíðir og skemmtanir fyrir hundrað árum',
'Aðrar upplýsingar',
'ekkert hér sem stendur'
);
values('Handkurra',
'Leiklýsingu vantar',
'Er prentað í: Þórarinn Guðmundsson (2010). Spilabókin - Allir helstu spilaleikir og spil.',
'Heimildir um notkun',
'Aðrar upplýsingar',
'ekkert her sem stendur'
);
values('Veiðimaður',
'Leiklýsingu vantar',
'Þórarinn Guðmundsson (2010). Spilabókin - Allir helstu spilaleikir og spil. Reykjavík: Bókafélagið. Bls. 19-20.',
'vantar',
'vantar',
'vantar'
);
以下に示す2つのソリューションがあります。
MySQLは、おそらく STRICT SQLモード にあります。 SQLクエリSET GLOBAL sql_mode=''
を実行するか、my.cnf/my.iniを編集して、STRICT_ALL_TABLES
やSTRICT_TRANS_TABLES
を設定していないことを確認してください。
Solution-1が機能しない場合は、以下の手順で説明されているSolution-2を試してください。
STRICT_ALL_TABLES
やSTRICT_TRANS_TABLES
を削除し、[変更の適用]をクリックします。注:MySQL Server 5.7でこれらのソリューションをテストしました
id
が主キーであるため、同じ値を持つ異なる行を持つことはできません。 id
が自動インクリメントされるようにテーブルを変更してみてください:
id int NOT NULL AUTO_INCREMENT
次に、主キーを次のように設定します。
PRIMARY KEY (id)
すべて一緒に:
CREATE TABLE card_games (
id int(11) NOT NULL AUTO_INCREMENT,
nafnleiks varchar(50),
leiklysing varchar(3000),
prentadi varchar(1500),
notkunarheimildir varchar(1000),
upplysingar varchar(1000),
ymislegt varchar(500),
PRIMARY KEY (id));
それ以外の場合は、毎回異なる値を設定するように注意しながら、すべての挿入でid
を指定できます。
insert into card_games (id, nafnleiks, leiklysing, prentadi, notkunarheimildir, upplysingar, ymislegt)
values(1, 'Svartipétur', 'Leiklýsingu vantar', 'Er prentað í: Þórarinn Guðmundsson (2010). Spilabókin - Allir helstu spilaleikir og spil.', 'Heimildir um notkun: Árni Sigurðsson (1951). Hátíðir og skemmtanir fyrir hundrað árum', 'Aðrar upplýsingar', 'ekkert hér sem stendur' );
Idはauto-increment
として設定する必要があります。
既存のid列を自動インクリメントに変更するには、これを追加するだけです
ALTER TABLE card_games MODIFY id int NOT NULL AUTO_INCREMENT;
テーブルの主キーにAutoIncrementを追加してExecuteNonQuery()を解決しているときにエラーが発生しました。あなたの場合、主キーを追加したくない場合は、主キーに値を割り当てる必要があります。
ALTER TABLE `t1`
CHANGE COLUMN `id` `id` INT(11) NOT NULL AUTO_INCREMENT ;
モデルクラスの主キーのセッターを定義していないことを確認してください。
public class User{
@Id
@GeneratedValues
private int user_Id;
private String userName;
public int getUser_Id{
return user_Id;
}
public String getUserName{
return userName;
}
public void setUserName{
this.userName=userName;
}
}
Mysql 5.6以降、テーブル定義でデフォルト値が設定されていないすべてのフィールドを明示的に挿入することを確実にする新しいデフォルトがあります。
これを無効にしてテストするには、こちらの回答を参照してください: mysql error 1364 Field does not have a default values
それなしでテストし、再度有効にして、すべてのテーブルがすべてのINSERTクエリで明示的に渡さないフィールドのデフォルト値を持っていることを確認することをお勧めします。
サードパーティのmysqlビューアがこのエラーを表示している場合、おそらくそのリンクの修正に制限されています。
これは、スキーマにデフォルト値が設定されていない空のフィールドを持つINSERTまたはUPDATEコマンドを許可しない厳格なモードセットを持つMySQLが原因です。
これにはいくつかの修正があります。
最初の「修正」は、スキーマにデフォルト値を割り当てることです。これは、単純なALTERコマンドで実行できます。
ALTER TABLE `details` CHANGE COLUMN `delivery_address_id` `delivery_address_id` INT(11) NOT NULL DEFAULT 0 ;
ただし、データベーススキーマ内の多くのテーブルでこれを行う必要があり、非常に短時間で退屈になります。 2番目の修正は、mysqlサーバーからsql_mode STRICT_TRANS_TABLESを削除することです。
BrewインストールされたMySQLを使用している場合、MySQLディレクトリのmy.cnfファイルを編集する必要があります。下部のsql_modeを変更します。
#sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
sql_mode=NO_ENGINE_SUBSTITUTION
ファイルを保存して、Mysqlを再起動します。
ソース: https://www.euperia.com/development/mysql-fix-field-doesnt-default-value/1509
解決策:STRICT_TRANS_TABLES
からsql_mode
を削除します
デフォルト設定を確認するには、
mysql> set @@sql_mode =
'STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
Query OK, 0 rows affected (0.00 sec)
mysql> select @@sql_mode;
+----------------------------------------------------------------+
| @@sql_mode |
+----------------------------------------------------------------+
| STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+----------------------------------------------------------------+
1 row in set (0.00 sec)
サンプルクエリを実行する
mysql> INSERT INTO nb (id) VALUES(3);
ERROR 1364 (HY000): Field 'field' doesn't have a default value
STRICT_TRANS_TABLES
をnullにリセットして削除します。
mysql> set @@sql_mode = '';
Query OK, 0 rows affected (0.00 sec)
次に、同じテストクエリを実行します。
mysql> INSERT INTO nb (id) VALUES(3);
Query OK, 1 row affected, 1 warning (0.00 sec)
私にとっては、変更すると問題が修正されました
<id name="personID" column="person_id">
<generator class="native"/>
</id>
に
<id name="personID" column="person_id">
<generator class="increment"/>
</id>
Person.hbm.xml
で。
その後、別のフィールド(mobno)で同じエラーに再遭遇しました。 IDEを再起動しようとしましたが、(ENGINE=InnoDB DEFAULT CHARSET=latin1;
を使用せずにフィールド名のアンダースコアを削除して)テーブルを再作成すると、以前のバックナンバーでデータベースを再作成して最終的に修正されました。
CREATE TABLE `tbl_customers` (
`pid` bigint(20) NOT NULL,
`title` varchar(4) NOT NULL,
`dob` varchar(10) NOT NULL,
`address` varchar(100) NOT NULL,
`country` varchar(4) DEFAULT NULL,
`hometp` int(12) NOT NULL,
`worktp` int(12) NOT NULL,
`mobno` varchar(12) NOT NULL,
`btcfrom` varchar(8) NOT NULL,
`btcto` varchar(8) NOT NULL,
`mmname` varchar(20) NOT NULL
)
の代わりに
CREATE TABLE `tbl_person` (
`person_id` bigint(20) NOT NULL,
`person_nic` int(10) NOT NULL,
`first_name` varchar(20) NOT NULL,
`sur_name` varchar(20) NOT NULL,
`person_email` varchar(20) NOT NULL,
`person_password` varchar(512) NOT NULL,
`mobno` varchar(10) NOT NULL DEFAULT '1',
`role` varchar(10) NOT NULL,
`verified` int(1) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
おそらくこれを使用しているためだと思いますENGINE=InnoDB DEFAULT CHARSET=latin1;
、以前の列名であったにもかかわらず、現在のテーブルには存在しないエラーorg.hibernate.engine.jdbc.spi.SqlExceptionHelper - Unknown column 'mob_no' in 'field list'
を一度取得したためデータベースをバックアップした後でも(InnoDBエンジンを使用して、変更された列名で)古いフィールド名で同じエラーが発生しました。これはおそらくそのエンジンでのキャッシュが原因です。
開発者はSTRICT
モードを使用することを強くお勧めします。これは、厳密モードをオフにして回避する代わりに、発生する可能性のある問題/エラー/警告を表示できるためです。また、より良い練習です。
厳密モードは、乱雑でずさんなコードを見るのに最適なツールです。
Mariadbを使用してAWSで問題が発生しました-これが、STRICT_TRANS_TABLESの問題を解決した方法です
サーバーにSSH接続し、ectディレクトリに移動します
[ec2-user]$ cd /etc
My.cnfのバックアップを作成します
[ec2-user etc]$ Sudo cp -a my.cnf{,.strict.bak}
編集にはnanoを使用していますが、他にもあります
[ec2-user etc]$ Sudo nano my.cnf
この行をmy.cnfファイルに追加します
#
#This removes STRICT_TRANS_TABLES
#
sql_mode=""
その後、終了して保存します
または、sql_modeが次のようなものである場合:
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
への変更
sql_mode=""
終了して保存
その後、データベースを再起動します
[ec2-user etc]$ Sudo systemctl restart mariadb
フィールド 'id'にはデフォルト値がありませんか?解決するために、私にとって驚くべきことです。
set sql_mode=""
set @@sql_mode = ''; etc
残念ながら、これらは私にはうまくいきませんでした。長い調査の結果、
@Entity
@Table(name="vendor_table")
public class Customer {
@Id
@Column(name="cid")
private int cid;
.....
}
@Entity
@Table(name="vendor_table")
public class Vendor {
@Id
private int vid;
@Column
private String vname;
.....
}
ここでは、両方のテーブルが同じ名前を持っていることがわかります。それは非常に面白い間違いであり、私によって行われました:))))。これを修正した後、私の問題は解消されました。