MySQL предупреждения - PullRequest
       9

MySQL предупреждения

2 голосов
/ 26 апреля 2009

У меня есть следующая таблица:

 CREATE TABLE `events` (
  `evt_id` int(11) NOT NULL AUTO_INCREMENT,
  `evt_name` varchar(50) NOT NULL,
  `evt_description` varchar(100) DEFAULT NULL,
  `evt_startdate` date NOT NULL,
  `evt_enddate` date DEFAULT NULL,
  `evt_starttime` time DEFAULT NULL,
  `evt_endtime` time DEFAULT NULL,
  `evt_amtpersons` int(11) DEFAULT NULL,
  `sts_id` int(11) NOT NULL,
  `adr_id` int(11) DEFAULT NULL,
  `evt_amtPersonsSubs` int(11) DEFAULT NULL,
  `evt_photo` varchar(50) DEFAULT NULL,
  `sys-mut-dt` timestamp NULL DEFAULT NULL,
  `sys-mut-user` varchar(20) DEFAULT NULL,
  `sys-mut-id` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`evt_id`),
  KEY `sts_id` (`sts_id`),
  KEY `adr_id` (`adr_id`),
  CONSTRAINT `sts_id` FOREIGN KEY (`sts_id`) REFERENCES `statusses` (`sts_id`) O
N DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=latin1

Теперь у меня две проблемы:

Вот мой запрос:

INSERT INTO `events`(`evt_name` , `evt_description` , `evt_startdate` , `evt_enddate` , `evt_starttime` , `evt_endtime` , `evt_amtpersons` , `sts_id` , `adr_id` , `evt_amtPersonsSubs` , `evt_photo` , `sys-mut-user` , `sys-mut-id`) VALUES ('asf' , 'asf' , '2009-04-02' , '2009-04-22' , '00:00:00' , '00:00:00' , '3' , '1' , '' , '' , '' , 'test' , '1')
  1. Когда я выполняю этот запрос через мои программы php, я не получаю ошибки. Но когда я выполняю запрос в оболочке непосредственно в базе данных mysql, я получаю два предупреждения. Как я могу заставить PHP предупреждать меня, когда есть предупреждения, потому что, если есть предупреждения, mysql не выполняет вставку.

  2. О предупреждениях:

| Предупреждение 1366 | Неверное целочисленное значение: '' для столбца 'adr_id' в строке 1 | Предупреждение 1366 | Неверное целочисленное значение: '' для столбца 'evt_amtPersonsSubs' в строке 1

Как мне избавиться от этих предупреждений? Пытался внести некоторые изменения, но пока не получилось.

Ответы [ 5 ]

5 голосов
/ 26 апреля 2009

Вы вставляете пустую строку. Вы должны удалить '' и поставить число в этом поле

Как вы сказали, столбец не должен иметь значение, указанное при вставке. Этот факт указывается значением «DEFAULT NULL» для этого столбца при создании таблицы. Этот факт, однако, означает, что если вы do не указываете имя столбца в списке столбцов при выполнении INSERT (и, следовательно, вы также не будете указывать соответствующее значение), тогда Кортеж может быть вставлен в любом случае, и для этого значения столбца вы получите NULL автоматически по умолчанию.

Однако в своем запросе вы указываете, что собираетесь вставить это значение столбца, а значение столбца, которое вы говорите, - '' (пустая строка). Это, конечно, недопустимо, потому что этот столбец принимает целые числа (или NULL, потому что вы не объявили столбец NOT NULL), а пустая строка является пустой строкой, а не целым числом.

SQL-сервер щедрый и в любом случае принимает пустую строку (возможно, он сбрасывает ее на ноль), но выдает предупреждение. Если вы установите строгий режим для сервера (что я настоятельно рекомендую вам сделать), вы получите сообщение об ошибке, и вставка не будет выполнена.

Обратите внимание, что если вы последуете моему предложению о настройке строгого режима, это будет сервер, охватывающий все ваши базы данных и все ваши таблицы (по крайней мере, для mysql, выпущенного год назад). Если у вас ужасно написано программное обеспечение, которому нужен прощающий сервер, вы не сможете его использовать.

1 голос
/ 26 апреля 2009

Сообщение об ошибке сообщает, что пустая строка ('') не является допустимым значением для целочисленного поля - в этом случае поля adr_id и evt_amtPersonsSubs. Вы хотели поставить NULL вместо этого?

В PHP вы можете получить сообщение об ошибке или предупреждение только для самого последнего запроса, используя функцию mysql_error () .

0 голосов
/ 16 июня 2016

Неявные значения по умолчанию определяются следующим образом:

  • Для числовых типов значением по умолчанию является 0, за исключением того, что для целочисленных типов или типов с плавающей запятой, объявленных с помощью AUTO_INCREMENT атрибут, значением по умолчанию является следующее значение в последовательности.

Справка:

0 голосов
/ 26 апреля 2009

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

Во всех местах, где у вас есть столбец типа int, вы не должны ставить значение между ', а просто ставить значение как

[...] '00:00:00', '00: 00: 00 ', 3, 1, [...]

Если вы не хотите предоставлять значение для определенного столбца, вы должны определить столбец с NULL. Тогда вы даже можете оставить свой '' для вставки.

НО

В общем, делать подобные вставки - плохая практика. Что если вам когда-нибудь понадобится добавить столбец в вашу таблицу? Затем вам нужно пойти и переписать свой код.

Поэтому вы должны делать вставки так:

INSERT INTO tbl_name (col1, col2) VALUES(value1, value2);

Таким образом, ваш код будет работать, даже если вы решите добавить столбцы. Плюс код легче читать !!

0 голосов
/ 26 апреля 2009

'' не является целым числом .... как насчет использования NULL в запросе, если вы действительно хотите нулевое значение?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...