web-dev-qa-db-fra.com

Le champ 'id' n'a pas de valeur par défaut?

Je suis nouveau à ce SQL; J'ai vu la même question avec des programmes beaucoup plus gros, que je ne comprends pas pour le moment. Je crée une base de données pour les jeux de cartes à utiliser dans ma page d'accueil. 

J'utilise MySQL Workbench sous Windows. L'erreur que je reçois est:

Code d'erreur: 1364. Le champ 'id' n'a pas de valeur par défaut

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

Il y a 2 solutions mentionnées ci-dessous:

Solution 1

MySQL est probablement en mode STRICT SQL . Essayez d'exécuter la requête SQL SET GLOBAL sql_mode='' ou modifiez votre fichier my.cnf/my.ini pour vous assurer que vous ne définissez pas STRICT_ALL_TABLES et/ou STRICT_TRANS_TABLES.

Solution 2

Si Solution-1 ne fonctionne pas, essayez alors Solution-2 comme indiqué dans les étapes ci-dessous:

  1. Exécutez l'outil administrateur MySQL en tant qu'administrateur.
  2. Ensuite, allez à la variable de démarrage.
  3. Ensuite, allez dans l'onglet Advance.
  4. trouvez le mode SQL et supprimez les STRICT_ALL_TABLES et/ou STRICT_TRANS_TABLES puis cliquez sur Appliquer les modifications.
  5. Redémarrez le serveur MySQL.
  6. Terminé.

Note: J'ai testé ces solutions dans MySQL Server 5.7

29
Renish Aghera

Comme id est la clé primaire, vous ne pouvez pas avoir différentes lignes avec la même valeur. Essayez de changer votre table de sorte que la id soit incrémentée automatiquement:

id int NOT NULL AUTO_INCREMENT

puis définissez la clé primaire comme suit:

PRIMARY KEY (id)

Tous ensemble:

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));

Sinon, vous pouvez indiquer la id dans chaque insertion, en prenant soin de définir chaque fois une valeur différente:

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

L'identifiant doit être défini comme auto-increment.

Pour modifier une colonne d’identification existante pour l’incrémenter automatiquement, ajoutez simplement

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

assurez-vous que vous n'avez pas défini de sélecteur pour la clé primaire dans la classe de modèle.

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

Depuis mysql 5.6, il existe une nouvelle valeur par défaut qui garantit que vous insérez explicitement tous les champs pour lesquels aucune valeur par défaut n'est définie dans la définition de la table.

pour désactiver et tester ceci: voyez cette réponse ici: erreur mysql 1364 Le champ n'a pas de valeurs par défaut

Je vous recommande de tester sans, puis de le réactiver et de vous assurer que toutes vos tables ont des valeurs par défaut pour les champs que vous ne transmettez pas explicitement à chaque requête INSERT.

Si une visionneuse mysql tierce génère cette erreur, vous êtes probablement limité au correctif de ce lien.

3
radoo

Solution: Supprimer STRICT_TRANS_TABLES de sql_mode 

Pour vérifier votre réglage par défaut, 

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)

Exécuter un exemple de requête 

mysql> INSERT INTO nb (id) VALUES(3);
ERROR 1364 (HY000): Field 'field' doesn't have a default value

Supprimez votre STRICT_TRANS_TABLES en le réinitialisant à null. 

mysql> set @@sql_mode = '';
Query OK, 0 rows affected (0.00 sec)

Maintenant, exécutez la même requête de test. 

mysql> INSERT INTO nb (id) VALUES(3);
Query OK, 1 row affected, 1 warning (0.00 sec)

Source: https://netbeans.org/bugzilla/show_bug.cgi?id=190731

2
biniam

Cela est dû au fait que MySQL a un ensemble de mode strict qui n'autorise pas les commandes INSERT ou UPDATE avec des champs vides pour lesquels le schéma n’a pas de valeur par défaut.

Il y a deux solutions à ce problème.

La première solution consiste à attribuer une valeur par défaut à votre schéma. Cela peut être fait avec une simple commande ALTER:

ALTER TABLE `details` CHANGE COLUMN `delivery_address_id` `delivery_address_id` INT(11) NOT NULL DEFAULT 0 ;

Cependant, cela peut être nécessaire pour de nombreuses tables dans votre schéma de base de données, ce qui deviendra très fastidieux. La deuxième solution consiste à supprimer sql_mode STRICT_TRANS_TABLES sur le serveur mysql.

Si vous utilisez une version installée de MySQL, vous devez éditer le fichier my.cnf dans le répertoire MySQL. Changer le sql_mode en bas:

#sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
sql_mode=NO_ENGINE_SUBSTITUTION

Enregistrez le fichier et redémarrez Mysql.

Source: https://www.euperia.com/development/mysql-fix-field-doesnt-default-value/1509

1
joseantgv

Pour moi, le problème a été résolu quand j'ai changé

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

à

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

dans mon Person.hbm.xml.

après cela, j'ai rencontré à nouveau la même erreur pour un autre champ (mobno). J'ai essayé de redémarrer mon IDE, recréer la base de données avec le précédent numéro a finalement été corrigé lorsque je recrée mes tables avec (sans ENGINE=InnoDB DEFAULT CHARSET=latin1; et en supprimant les caractères de soulignement dans le nom du champ)

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
)

au lieu de

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;

Je pense probablement que cela est dû à l'utilisation de ENGINE=InnoDB DEFAULT CHARSET=latin1;, car j'ai déjà eu l'erreur org.hibernate.engine.jdbc.spi.SqlExceptionHelper - Unknown column 'mob_no' in 'field list' même s'il s'agissait de mon nom de colonne précédent, qui n'existe même pas dans ma table actuelle. Même après avoir sauvegardé la base de données (avec le nom de colonne modifié, en utilisant le moteur InnoDB), j'ai toujours la même erreur avec l'ancien nom de champ. Ceci est probablement dû à la mise en cache dans ce moteur.

1
user158

En tant que développeur, il est vivement recommandé d'utiliser le mode STRICT car il vous permettra de voir les problèmes/erreurs/avertissements pouvant survenir au lieu de simplement contourner le problème en désactivant le mode strict. C'est aussi une meilleure pratique. 

Le mode strict est un excellent outil pour voir le code en désordre et négligé. 

0
ex8

J'ai eu un problème sur AWS avec mariadb - Voici comment j'ai résolu le problème STRICT_TRANS_TABLES

SSH sur le serveur et accès au répertoire ect 

[ec2-user]$ cd /etc

Faire une sauvegarde de my.cnf

[ec2-user etc]$ Sudo cp -a my.cnf{,.strict.bak}

J'utilise nano pour éditer mais il y en a d'autres 

[ec2-user etc]$ Sudo nano my.cnf

Ajouter cette ligne dans le fichier my.cnf

#
#This removes STRICT_TRANS_TABLES
#
sql_mode=""

Puis quittez et enregistrez

OU si sql_mode existe-t-il à peu près comme ceci:

sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

Changer en 

sql_mode=""

sortir et sauvegarder

puis redémarrez la base de données

[ec2-user etc]$ Sudo systemctl restart mariadb
0
Andrew Wood

C'est incroyable pour moi, pour résoudre Field 'id' n'a pas de valeur par défaut? J'ai essayé tous les moyens possibles de ce qui est donné ici, comme ..

set sql_mode=""
set @@sql_mode = ''; etc

mais malheureusement ceux-ci n'ont pas fonctionné pour moi ... donc après une longue enquête, j'ai trouvé que 

@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;
    .....
}

vous pouvez voir ici que les deux tables portent le même nom. C'est une erreur très drôle, a été fait par moi :)))). Après avoir corrigé cela, mon problème avait disparu.

0
Brajesh