MySQL, лучше вставить NULL или пустую строку?
У меня есть форма на сайт, который имеет много разных полей. Некоторые поля являются необязательными, а некоторые-обязательными. В моей БД у меня есть таблица, которая содержит все эти значения, лучше ли вставлять нулевое значение или пустую строку в столбцы БД, где пользователь не помещал никаких данных?
6 ответов
С помощью NULL
вы можете различать "нет данных "и"пустые данные".
еще несколько отличий:
A
LENGTH
ofNULL
иNULL
, aLENGTH
пустая строка0
.NULL
s сортируются перед пустыми строками.COUNT(message)
будем считать пустые строки, но неNULL
s-
вы можете искать пустую строку использование связанной переменной, но не для
NULL
. Этот запрос:SELECT * FROM mytable WHERE mytext = ?
никогда не будет соответствовать
NULL
наmytext
, любое значение, которое вы передаете от клиента. Чтобы соответствоватьNULL
s, вам придется использовать другой запрос:SELECT * FROM mytable WHERE mytext IS NULL
одна вещь, чтобы рассмотреть, если вы когда-нибудь план переключения баз данных, это Oracle не поддерживает пустые строки. Они автоматически преобразуются в NULL, и вы не можете запросить их с помощью таких предложений, как WHERE somefield = ''
.
следует иметь в виду, что NULL может сделать ваши кодовые пути намного сложнее. В Python, например, большинство адаптеров базы данных / ORMs map NULL
to None
.
Итак, такие вещи, как:
print "Hello, %(title)s %(firstname) %(lastname)!" % databaserow
может привести к "Hello, None Joe Doe!"Чтобы избежать этого, вам нужно что-то вроде этого кода:
if databaserow.title:
print "Hello, %(title)s %(firstname) %(lastname)!" % databaserow
else:
print "Hello, %(firstname) %(lastname)!" % databaserow
что может сделать вещи гораздо более сложными.
лучше вставить NULL
для согласованности в вашей базе данных в MySQL. Внешние ключи могут храниться как NULL
но не как пустые строки.
у вас будут проблемы с пустая строка в ограничениях. Возможно, вам придется вставить поддельную запись с уникальная пустой строкой для удовлетворения ограничения внешнего ключа. Наверное, плохая практика.
Читайте также: может ли внешний ключ быть нулевым и / или дубликатом?
Я не знаю, какая лучшая практика будет здесь, но я обычно ошибаюсь в пользу null, если вы не хотите, чтобы null означал что-то отличное от пустой строки, и ввод пользователя соответствует вашему определению пустой строки.
обратите внимание, что я говорю, что вам нужно определить, как вы хотите, чтобы они были разными. Иногда имеет смысл отличать их друг от друга, иногда нет. Если нет, просто выберите один и придерживайтесь его. Как я уже сказал, Я склоняюсь к нулю большую часть время.
О, и имейте в виду, что если столбец равен null, запись с меньшей вероятностью появится практически в любом запросе, который выбирает (имеет предложение where, в терминах SQL) на основе этого столбца, если выбор не для нулевого столбца, конечно.
если вы используете несколько столбцов в уникальном индексе, и хотя бы один из этих столбцов является обязательным (т. е. поле требуемой формы), если вы установите другие столбцы в индексе в значение NULL, вы можете получить дублированные строки. Это потому, что значения 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', '', '');
Итак, здесь нет правильного или неправильного. Это до вас решить, что лучше всего работает с вашими бизнес-правилами.