web-dev-qa-db-ja.com

フィールド 'id'にはデフォルト値がありませんか?

私はこの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'
);
42

以下に示す2つのソリューションがあります。

解決策1

MySQLは、おそらく STRICT SQLモード にあります。 SQLクエリSET GLOBAL sql_mode=''を実行するか、my.cnf/my.iniを編集して、STRICT_ALL_TABLESSTRICT_TRANS_TABLESを設定していないことを確認してください。

解決策2

Solution-1が機能しない場合は、以下の手順で説明されているSolution-2を試してください。

  1. 管理者としてMySQL管理ツールを実行します。
  2. 次に、スタートアップ変数に移動します。
  3. 次に、[詳細設定]タブに移動します。
  4. sQLモードを見つけてSTRICT_ALL_TABLESSTRICT_TRANS_TABLESを削除し、[変更の適用]をクリックします。
  5. MySQLサーバーを再起動します。
  6. できた.

注:MySQL Server 5.7でこれらのソリューションをテストしました

34
Renish Aghera

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' );
30
fedorqui

Idはauto-incrementとして設定する必要があります。

既存のid列を自動インクリメントに変更するには、これを追加するだけです

ALTER TABLE card_games MODIFY id int NOT NULL AUTO_INCREMENT;
19
John Joe

テーブルの主キーにAutoIncrementを追加してExecuteNonQuery()を解決しているときにエラーが発生しました。あなたの場合、主キーを追加したくない場合は、主キーに値を割り当てる必要があります。

ALTER TABLE `t1` 
CHANGE COLUMN `id` `id` INT(11) NOT NULL AUTO_INCREMENT ;
4
hardik patel

モデルクラスの主キーのセッターを定義していないことを確認してください。

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;
}
}
3
Vivek Pal

Mysql 5.6以降、テーブル定義でデフォルト値が設定されていないすべてのフィールドを明示的に挿入することを確実にする新しいデフォルトがあります。

これを無効にしてテストするには、こちらの回答を参照してください: mysql error 1364 Field does not have a default values

それなしでテストし、再度有効にして、すべてのテーブルがすべてのINSERTクエリで明示的に渡さないフィールドのデフォルト値を持っていることを確認することをお勧めします。

サードパーティのmysqlビューアがこのエラーを表示している場合、おそらくそのリンクの修正に制限されています。

3
radoo

これは、スキーマにデフォルト値が設定されていない空のフィールドを持つ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

2
joseantgv

解決策: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)

ソース: https://netbeans.org/bugzilla/show_bug.cgi?id=190731

2
biniam

私にとっては、変更すると問題が修正されました

<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エンジンを使用して、変更された列名で)古いフィールド名で同じエラーが発生しました。これはおそらくそのエンジンでのキャッシュが原因です。

1
user158

開発者はSTRICTモードを使用することを強くお勧めします。これは、厳密モードをオフにして回避する代わりに、発生する可能性のある問題/エラー/警告を表示できるためです。また、より良い練習です。

厳密モードは、乱雑でずさんなコードを見るのに最適なツールです。

0
ex8

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
0
Andrew Wood

フィールド '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;
    .....
}

ここでは、両方のテーブルが同じ名前を持っていることがわかります。それは非常に面白い間違いであり、私によって行われました:))))。これを修正した後、私の問題は解消されました。

0
Brajesh