[英]Field 'id' doesn't have a default value?
我是這個 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'
);
由於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' );
下面提到了2個解決方案:
MySQL 很可能處於STRICT SQL 模式。 嘗試執行 SQL 查詢SET GLOBAL sql_mode=''
或編輯您的 my.cnf / my.ini 以確保您沒有設置STRICT_ALL_TABLES
和/或STRICT_TRANS_TABLES
。
如果解決方案 1 不起作用,請按照以下步驟嘗試解決方案 2:
STRICT_ALL_TABLES
和/或STRICT_TRANS_TABLES
,然后單擊 Apply Changes。注意:我已經在 MySQL Server 5.7 中測試過這些解決方案
id 應設置為auto-increment
。
要將現有的 id 列修改為自動遞增,只需添加此
ALTER TABLE card_games MODIFY id int NOT NULL AUTO_INCREMENT;
當 ExecuteNonQuery() 通過將 AutoIncrement 添加到我的表的主鍵來解決時,我遇到了錯誤。 在您的情況下,如果您不想添加主鍵,那么我們必須需要為主鍵賦值。
ALTER TABLE `t1`
CHANGE COLUMN `id` `id` INT(11) NOT NULL AUTO_INCREMENT ;
從 mysql 5.6 開始,有一個新的默認值可確保您明確插入在表定義中沒有設置默認值的每個字段。
禁用和測試這個:在這里看到這個答案: mysql error 1364 Field doesn't have a default values
我建議您在沒有它的情況下進行測試,然后重新啟用它並確保您的所有表都具有您未在每個 INSERT 查詢中顯式傳遞的字段的默認值。
如果第三方 mysql 查看器出現此錯誤,您可能僅限於該鏈接中的修復程序。
這是由於 MySQL 設置了嚴格的模式,該模式不允許 INSERT 或 UPDATE 命令具有空字段,而模式沒有設置默認值。
對此有幾個修復。
第一個“修復”是為您的架構分配一個默認值。 這可以通過一個簡單的 ALTER 命令來完成:
ALTER TABLE `details` CHANGE COLUMN `delivery_address_id` `delivery_address_id` INT(11) NOT NULL DEFAULT 0 ;
但是,這可能需要對數據庫模式中的許多表執行此操作,這將很快變得乏味。 第二個修復是刪除 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
確保您沒有為模型類中的主鍵定義 setter。
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;
}
}
要檢測運行:
select @@sql_mode
-- It will give something like:
-- STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
要修復,請運行:
set global sql_mode = ''
如果您將 AUTO_INCREMENT 子句添加到數據庫表中的主鍵 id 字段,如下所示,它將起作用。
創建表user_role
( user_role_id
bigint NOT NULL AUTO_INCREMENT, user_id
bigint NOT NULL, role_id
bigint NOT NULL,
解決方案:從sql_mode
刪除STRICT_TRANS_TABLES
要檢查您的默認設置,
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
。
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
對我來說,當我改變時問題得到了解決
<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 引擎)之后,我仍然遇到與舊字段名相同的錯誤。 這可能是由於該引擎中的緩存。
我在 2019 年提出了這個問題。我的問題是用 table2 更新 table1 忽略兩個表中具有不同名稱的變量。 我遇到了與問題中提到的相同的錯誤:錯誤代碼:1364。字段'id'在mysql中沒有默認值。 以下是解決方法:
表 1 Schema : id (unique & auto increment)| 姓名 | 簡介 | 年齡表2 Schema:motherage| 父親| 姓名| 輪廓
這解決了我的錯誤: INSERT IGNORE INTO table2 (name,profile) SELECT name, profile FROM table1
禁用 FOREIGN_KEY_CHECKS 然后
`SET FOREIGN_KEY_CHECKS = 0;
ALTER TABLE card_games MODIFY COLUMN id INT NOT NULL AUTO_INCREMENT;
設置 FOREIGN_KEY_CHECKS = 1;`
作為開發人員,強烈建議使用STRICT
模式,因為它可以讓您查看可能出現的問題/錯誤/警告,而不僅僅是通過關閉嚴格模式來解決它。 這也是更好的做法。
嚴格模式是查看凌亂、草率代碼的好工具。
我在 AWS 上遇到了 mariadb 的問題 - 這就是我解決 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
對我來說太神奇了,解決Field '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;
.....
}
在這里您可以看到兩個表具有相同的名稱。 這是一個非常有趣的錯誤,是我做的:))))。 改正后,我的問題就解決了。
為您的 Id 添加一個默認值讓我們在您的表定義中說這將解決您的問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.