Поле 'id' не имеет значения по умолчанию?
Я новичок в этом SQL; Я видел аналогичный вопрос с гораздо большими программами, которые я не могу понять на данный момент. Я делаю базу данных для карточных игр, которые можно использовать на моей домашней странице.
Я использую MySQL Workbench в Windows. Ошибка, которую я получаю:
Код ошибки: 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'
);
Ответы
Ответ 1
Есть 2 решения, упомянутые ниже:
Решение 1
MySQL, скорее всего, работает в режиме STRICT SQL. Попробуйте выполнить SQL-запрос SET GLOBAL sql_mode=''
или отредактируйте my.cnf/my.ini, чтобы убедиться, что вы не устанавливаете STRICT_ALL_TABLES
и/или STRICT_TRANS_TABLES
.
Решение 2
Если Решение-1 не работает, попробуйте Решение-2, как указано в следующих шагах:
- Запустите инструмент администрирования MySQL от имени администратора.
- Затем перейдите к переменной запуска.
- Затем перейдите на вкладку Advance.
- найдите режим SQL и удалите
STRICT_ALL_TABLES
и/или STRICT_TRANS_TABLES
а затем нажмите "Применить изменения". - Перезапустите MySQL Server.
- Готово.
Примечание. Я тестировал эти решения в MySQL Server 5.7.
Ответ 2
Поскольку 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' );
Ответ 3
Идентификатор должен быть установлен как auto-increment
.
Чтобы изменить существующий столбец идентификатора для автоматического увеличения, просто добавьте это
ALTER TABLE card_games MODIFY id int NOT NULL AUTO_INCREMENT;
Ответ 4
Я получал сообщение об ошибке, в то время как ExecuteNonQuery() разрешается с добавлением AutoIncrement к первичному ключу моей таблицы. В вашем случае, если вы не хотите добавлять первичный ключ, мы должны присвоить значение первичному ключу.
ALTER TABLE 't1'
CHANGE COLUMN 'id' 'id' INT(11) NOT NULL AUTO_INCREMENT ;
Ответ 5
убедитесь, что для основного ключа в классе модели у вас нет определенного установщика.
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;
}
}
Ответ 6
Так как mysql 5.6 существует новое значение по умолчанию, убедитесь, что вы явно вставляете каждое поле, которое не имеет значения по умолчанию, установленного в определении таблицы.
отключить и протестировать это: см. этот ответ здесь: ошибка mysql 1364 Поле не имеет значений по умолчанию
Я бы порекомендовал вам протестировать без него, затем повторно его использовать и убедиться, что все ваши таблицы имеют значения по умолчанию для полей, которые вы явно не передаете в каждом запросе INSERT.
Если сторонняя программа mysql viewer сообщает об этой ошибке, вероятно, вы ограничены исправлением в этой ссылке.
Ответ 7
Это вызвано тем, что MySQL имеет строгий режим, который не позволяет командам INSERT или UPDATE с пустыми полями, где у схемы нет установленного значения по умолчанию.
Есть несколько исправлений для этого.
Первое исправление - назначить значение по умолчанию для вашей схемы. Это можно сделать с помощью простой команды ALTER:
ALTER TABLE `details` CHANGE COLUMN `delivery_address_id` `delivery_address_id` INT(11) NOT NULL DEFAULT 0 ;
Однако это может потребоваться для многих таблиц в вашей схеме базы данных, которая станет очень утомительной. Второе исправление - удалить sql_mode STRICT_TRANS_TABLES на сервере mysql.
Если вы используете установленный MySQL brew, вы должны отредактировать файл my.cnf в каталоге MySQL. Измените 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
Ответ 8
Решение: удалите 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
, сбросив его до нуля.
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
Ответ 9
Для меня проблема была исправлена, когда я изменил
<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), я все еще получаю ту же ошибку со старым именем поля. Возможно, это связано с кэшированием в этом Engine.
Ответ 10
В качестве разработчика настоятельно рекомендуется использовать режим STRICT
, потому что он позволит вам видеть проблемы/ошибки/предупреждения, которые могут возникнуть, а не просто обойти его, отключив строгий режим. Это также лучшая практика.
Строгий режим - отличный инструмент для просмотра грязного, неаккуратного кода.
Ответ 11
У меня возникла проблема в AWS с mariadb - так я решил проблему с STRICT_TRANS_TABLES
SSH на сервер и переключиться в каталог ect
[ec2-user]$ cd /etc
Сделайте резервную копию my.cnf
[ec2-user etc]$ sudo cp -a my.cnf{,.strict.bak}
Я использую нано для редактирования, но есть и другие
[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
Ответ 12
Это удивительно для меня, для решения Поле '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;
.....
}
Здесь вы можете видеть, что обе таблицы имеют одинаковые имена. Это очень забавная ошибка, сделанная мной :)))). После исправления этого моя проблема исчезла.
Ответ 13
Я могу сказать вам, VARCHAR от 0 до 255.
Ответ 14
Я получил этот вопрос в 2019 году. Моей проблемой было обновление таблицы1 таблицей2, игнорируя переменные с разными именами в обеих таблицах. Я получил ту же ошибку, что и упомянутый в вопросе: Код ошибки: 1364. Поле "id" не имеет значения по умолчанию в mysql. Вот как это решено:
Таблица 1 Схема: идентификатор (уникальный & автоинкремент) | имя | профиль | Возраст
Таблица 2 Схема: Motherage | отец | имя | профиль
Это решило мою ошибку:
INSERT IGNORE INTO table2 (имя, профиль) ВЫБРАТЬ имя, профиль ИЗ table1
Ответ 15
добавьте значение по умолчанию для вашего идентификатора, скажем, в определении таблицы это решит вашу проблему.