it-roy-ru.com

Поле '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'
);
34
Tomas Albertsson

Есть 2 решения, упомянутые ниже:

Решение 1

MySQL, скорее всего, находится в режиме STRICT SQL . Попробуйте выполнить SQL-запрос SET GLOBAL sql_mode='' или отредактируйте my.cnf/my.ini, чтобы убедиться, что вы не устанавливаете STRICT_ALL_TABLES и/или STRICT_TRANS_TABLES.

Решение 2

Если Решение-1 не работает, попробуйте Решение-2, как указано в следующих шагах:

  1. Запустите MySQL Administrator tool от имени администратора.
  2. Затем перейдите к переменной запуска.
  3. Затем перейдите на вкладку Advance.
  4. найдите режим SQL и удалите STRICT_ALL_TABLES и/или STRICT_TRANS_TABLES, а затем нажмите «Применить изменения».
  5. Перезапустите MySQL Server.
  6. Готово.

Примечание: Я тестировал эти решения в MySQL Server 5.7.

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

Идентификатор должен быть установлен как auto-increment.

Чтобы изменить существующий столбец идентификатора для автоматического увеличения, просто добавьте это

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

убедитесь, что у вас нет определенного установщика для первичного ключа в классе модели.

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 Поле не имеет значений по умолчанию

Я бы порекомендовал вам протестировать без него, затем снова включить его и убедиться, что во всех ваших таблицах есть значения по умолчанию для полей, которые вы явно не передаете в каждом запросе INSERT.

Если сторонняя программа просмотра mysql выдает эту ошибку, вы, вероятно, ограничены исправлением в этой ссылке.

3
radoo

Решение: удалите 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

2
biniam

Это вызвано тем, что в 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

1
joseantgv

Для меня проблема была решена, когда я изменился

<id name="personID" column="person_id">
    <generator class="native"/>
</id>

в

<id name="personID" column="person_id">
    <generator class="increment"/>
</id>

в моем Person.hbm.xml.

после этого я снова столкнулся с той же ошибкой для другого поля (мобно). Я попытался перезапустить мою 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

У меня возникла проблема в 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
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