web-dev-qa-db-fra.com

Comment définir la valeur par défaut d'un champ sur "0000-00-00 00:00:00"?

Comment définir la valeur par défaut d'un champ sur "0000-00-00 00:00:00"? Si nous ne pouvons pas utiliser '0000-00-00 00:00:00' par défaut? Quelle est la date de validité basic?

Par exemple, ceci est le SQL pour créer ma table d'article,

-- -----------------------------------------------------
-- Table `article`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `article` ;

CREATE TABLE IF NOT EXISTS `article` (
  `article_id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  `url` VARCHAR(255) NOT NULL,
  `title` VARCHAR(255) NOT NULL,
  `date_from` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT 'Set the article as new or featured from a datetime.',
  `date_to` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT 'Set the article as new or featured to a datetime.',
  `backdated_on` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT 'The manual datetime that is modified or input by the user.',
  `created_on` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT 'The permanent datetime when the article is created.',
  `updated_on` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'The datetime when the article is updated on.',
  PRIMARY KEY (`article_id`, `parent_id`, `template_id`),
  UNIQUE INDEX `url_UNIQUE` (`url` ASC))
ENGINE = MyISAM
AUTO_INCREMENT = 66
COMMENT = 'Entity that holds the article with one-to-one properties.';

Je reçois cette erreur quand je lance cette requête,

#1067 - Invalid default value for 'date_from' 
16
laukok

Cause de l'erreur: le mode SQL 

Vous pouvez définir la valeur par défaut d'un champ DATE, DATETIME ou TIMESTAMP sur la valeur "zéro" spéciale de "0000-00-00" comme date fictive si le mode SQL le permet. Pour les versions de MySQL inférieures à 5.7.4, cela est régi par le mode NO_ZERO_DATE, voir cet extrait de la documentation }:

MySQL vous permet de stocker une valeur «zéro» de «0000-00-00» en tant que "Date factice". Dans certains cas, c'est plus pratique que d'utiliser NULL valeurs et utilise moins de données et d’espace d’index. Pour interdire '0000-00-00', activer le mode SQL NO_ZERO_DATE.

De plus, le mode strict doit être activé pour interdire les valeurs "zéro":

Si ce mode et le mode strict sont activés, '0000-00-00' n'est pas autorisé
et les insertions produisent une erreur, sauf si IGNORE est également indiqué.

A partir de MySQL 5.7.4 cela ne dépend que du mode strict:

Le mode strict détermine si le serveur autorise "0000-00-00" en tant que date valide: 

Si le mode strict n'est pas activé, '0000-00-00' est autorisé et inséré produire aucun avertissement. 

Si le mode strict est activé, '0000-00-00' n'est pas autorisé et insère produire une erreur, sauf si IGNORE est également donné. Pour INSERT IGNORE et UPDATE IGNORE, '0000-00-00' est autorisé et les insertions produisent un Attention.

Vérifier la version et le mode SQL

Donc, vous devriez vérifier votre version de MySQL et le mode SQL de votre serveur MySQL avec

SELECT version();
SELECT @@GLOBAL.sql_mode global, @@SESSION.sql_mode session

Activer le INSERT

Vous pouvez définir le sql_mode pour votre session avec SET sql_mode = '<desired mode>' 

SET sql_mode = 'STRICT_TRANS_TABLES';   

Plage valide pour DATETIME 

La plage prise en charge pour DATETIME est 

[1000-01-01 00:00:00] to ['9999-12-31 23:59:59'], 

la valeur DATETIME minimale valide est donc '1000-01-01 00:00:00'.
Je ne recommanderais cependant pas d'utiliser cette valeur.

Remarque additionnelle 

Depuis MySQL 5.6.5, toutes les colonnes TIMESTAMP et DATETIME peuvent avoir le comportement magique (initialisation et/ou mise à jour), pas seulement TIMESTAMP et une seule colonne au plus, consultez Initialisation et mise à jour automatiques pour TIMESTAMP et DATETIME }

Depuis MySQL 5.6.5, les colonnes TIMESTAMP et DATETIME peuvent être automatiquement initialisé et mis à jour à la date et à l’heure actuelles (c’est-à-dire l’horodatage actuel ). Avant la version 5.6.5, cela n’est vrai que pour TIMESTAMP et pour au plus une colonne TIMESTAMP par table. Les notes suivantes d'abord Décrire l’initialisation et la mise à jour automatiques de MySQL 5.6.5 et plus, puis les différences pour les versions antérieures à 5.6.5.

Vous pouvez modifier votre instruction CREATE TABLE dans le cas de MySQL 5.6.5 ou plus récente en:

CREATE TABLE IF NOT EXISTS `article` (
  `article_id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  `url` VARCHAR(255) NOT NULL,
  `title` VARCHAR(255) NOT NULL,
  `date_from` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT 'Set the article as new or featured from a datetime.',
  `date_to` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT 'Set the article as new or featured to a datetime.',
  `backdated_on` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT 'The manual datetime that is modified or input by the user.',
  `created_on` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'The permanent datetime when the article is created.',
  `updated_on` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'The datetime when the article is updated on.',
  PRIMARY KEY (`article_id`, `parent_id`, `template_id`),
  UNIQUE INDEX `url_UNIQUE` (`url` ASC))
ENGINE = MyISAM
AUTO_INCREMENT = 66
COMMENT = 'Entity that holds the article with one-to-one properties.';
37
VMai

Il y a une solution… .. Je ne suis pas sûr de la sécurité de cette solution, alors je recommande de

SELECT @@SESSION.sql_mode session

premier. Enregistrez la valeur dans votre presse-papiers, puis

SET SESSION sql_mode = '';

Après cela, vous pouvez créer ou modifier la table avec des valeurs par défaut telles que '0000-00-00 00:00:00'

6
rebduvid

Les dates dans SQL Server ne peuvent être que du 1er janvier 1753 au 31 décembre 9999.

Vous devez décider comment gérer les dates/heures manquantes ou par défaut en tant qu'organisation ou groupe (NULL ou l'un de ces extrêmes). En règle générale, notre organisation choisit d’y aller sans date au lieu de 1753 ou 9999. Quand il n'y a pas de date, NULL est plus approprié que d'avoir n'importe quelle date, aussi ridicule que cela puisse paraître dans les années 1750 ou 9999. Si vous laissez les dates manquantes en tant que NULL, vous éviterez également les rapports contenant des dates fictives. 

http://msdn.Microsoft.com/en-us/library/ms187819.aspx

2
Patrick Tucci

Vous pouvez aussi remplacer les modes comme ça, ça marche. 

SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'NO_AUTO_CREATE_USER',''));
0
sree

Remplacer le code de:

 CREATE TABLE IF NOT EXISTS `article` (
` Article_id` INT (10) UNSIGNED NOT NULL AUTO_INCREMENT, 
 `Url` VARCHAR (255) NON NULL, 
` Title` VARCHAR (255) NON NULL, 
 `date_from` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT 'Définissez l'article en tant que nouveau ou présenté à partir d'une date/heure.', 
 'date_to` DATETIME NOT NULL DEFAULT' 0000- 00-00 00:00:00 'COMMENT' Définissez l'article en tant que nouveau ou en vedette sur une date/heure. ', 
' Backdated_on` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT 'Le manuel date/heure modifiée ou entrée par l'utilisateur. ', 
 `created_on` DATETIME NOT NULL DEFAUT CURRENT_TIMESTAMP COMMENT' La date-heure permanente à laquelle l'article est créé. ', 
' updated_on` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP SUR UPDATE CURRENT_TIMESTAMP COMMENT 'La date et l'heure auxquelles l'article est mis à jour.', 
 PRIMARY KEY (`article_id`,` parent_id`, `template_id`), 
 UNIQUE INDEX` url_UNIQUE` (`url` ASC)) 
 MOTEUR = MyISAM 
 AUTO_INCREMENT = 66 
 COMMENT = 'Entité qui détient l'article avec des propriétés un-à-un.'; 

à


 CREATE TABLE IF NOT EXISTS `article` (
` Article_id` INT (10) UNSIGNED NOT NULL AUTO_INCREMENT, 
 `Url` VARCHAR (255) NON NULL, 
` Title` VARCHAR (255) NON NULL, 
 `date_from` DATETIME NOT NULL DEFAULT '1000-01-01 00:00:00' COMMENT 'Définissez l'article en tant que nouveau ou présenté à partir d'une date/heure.', 
 'date_to` DATETIME NOT NULL DEFAULT' 1000- 01-01 00:00:00 'COMMENT' Définissez l'article en tant que nouveau ou en vedette sur une date/heure. ', 
' Backdated_on` DATETIME NOT NULL DEFAULT '1000-01-01 00:00:00' COMMENT 'Le manuel date/heure modifiée ou entrée par l'utilisateur. ', 
 `created_on` DATETIME NOT NULL DEFAUT CURRENT_TIMESTAMP COMMENT' La date-heure permanente à laquelle l'article est créé. ', 
' updated_on` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP SUR UPDATE CURRENT_TIMESTAMP COMMENT 'La date et l'heure auxquelles l'article est mis à jour.', 
 PRIMARY KEY (`article_id`,` parent_id`, `template_id`), 
 UNIQUE INDEX` url_UNIQUE` (`url` ASC)) 
 MOTEUR = MyISAM 

Son travail pour moi et il sera utile pour PHP 7 et MySQL 5.7

0
Jaymin