MySQL, лучше вставить NULL или пустую строку?
У меня есть форма на веб-сайте, который имеет много различных полей. Некоторые поля являются необязательными, а некоторые-обязательными. В моей БД у меня есть таблица, которая содержит все эти значения, лучше ли вставлять нулевое значение или пустую строку в столбцы БД, где пользователь не помещал никаких данных?
6 ответов:
С помощью
NULLвы можете различать "положить нет данных"и" положить пустые данные".еще несколько отличий:
A
LENGTHнаNULLиNULL, aLENGTHпустая строка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