MySQL, лучше вставить NULL или пустую строку?



У меня есть форма на веб-сайте, который имеет много различных полей. Некоторые поля являются необязательными, а некоторые-обязательными. В моей БД у меня есть таблица, которая содержит все эти значения, лучше ли вставлять нулевое значение или пустую строку в столбцы БД, где пользователь не помещал никаких данных?

451   6  

6 ответов:

С помощью NULL вы можете различать "положить нет данных"и" положить пустые данные".

еще несколько отличий:

  • A LENGTH на NULL и NULL, a LENGTH пустая строка 0.

  • NULLs сортируются перед пустыми строками.

  • COUNT(message) будем считать пустые строки, но не NULLs

  • вы можете найти пустую строку используя связанную переменную, но не для NULL. Этот запрос:

    SELECT  *
    FROM    mytable 
    WHERE   mytext = ?
    

    никогда не будет соответствовать NULL на mytext, любое значение, которое вы передаете от клиента. Чтобы соответствовать NULLs, вам придется использовать другой запрос:

    SELECT  *
    FROM    mytable 
    WHERE   mytext IS NULL
    

одна вещь, чтобы рассмотреть, если вы когда-нибудь план на переключение между базами данных, заключается в том, что Oracle не поддерживает пустые строки. Они автоматически преобразуются в NULL, и вы не можете запросить их с помощью таких предложений, как WHERE somefield = '' .

одна вещь, чтобы иметь в виду, что NULL может сделать ваши кодовые пути гораздо сложнее. В Python, например, большинство адаптеров баз данных / ORMs map NULL до None.

поэтому такие вещи, как:

print "Hello, %(title)s %(firstname) %(lastname)!" % databaserow

может привести к "Привет, нет Джо Доу!"Чтобы избежать этого, вам нужно что-то вроде этого кода:

if databaserow.title:
    print "Hello, %(title)s %(firstname) %(lastname)!" % databaserow
else:
    print "Hello, %(firstname) %(lastname)!" % databaserow

что может сделать вещи намного сложнее.

лучше вставить NULL для согласованности в вашей базе данных в MySQL. Внешние ключи могут храниться как NULL но не как пустые строки.

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

Читайте также: может ли внешний ключ быть NULL и / или дублировать?

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

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

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

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

COLUMNS IN A UNIQUE INDEX:
(event_type_id, event_title, date, location, url)

EXAMPLE 1:
(1, 'BBQ', '2018-07-27', null, null)
(1, 'BBQ', '2018-07-27', null, null) // allowed and duplicated.

EXAMPLE 2:
(1, 'BBQ', '2018-07-27', '', '')
(1, 'BBQ', '2018-07-27', '', '') // NOT allowed as it's duplicated.

вот некоторые коды:

CREATE TABLE `test` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `event_id` int(11) DEFAULT NULL,
  `event_title` varchar(50) DEFAULT NULL,
  `date` date DEFAULT NULL,
  `location` varchar(50) DEFAULT NULL,
  `url` varchar(200) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `event_id` (`event_id`,`event_title`,`date`,`location`,`url`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

теперь вставьте это, чтобы увидеть, что это позволит дублированные строки:

INSERT INTO `test` (`id`, `event_id`, `event_title`, `date`, `location`, 
`url`) VALUES (NULL, '1', 'BBQ', '2018-07-27', NULL, NULL);

INSERT INTO `test` (`id`, `event_id`, `event_title`, `date`, `location`, 
`url`) VALUES (NULL, '1', 'BBQ', '2018-07-27', NULL, NULL);

теперь вставьте это и проверьте, что это не разрешено:

INSERT INTO `test` (`id`, `event_id`, `event_title`, `date`, `location`, 
`url`) VALUES (NULL, '1', 'BBQ', '2018-07-28', '', '');

INSERT INTO `test` (`id`, `event_id`, `event_title`, `date`, `location`, 
`url`) VALUES (NULL, '1', 'BBQ', '2018-07-28', '', '');

Итак, здесь нет правильного или неправильного. Это до вас решить, что лучше всего работает с вашими бизнес-правилами.

Comments

    Ничего не найдено.