Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737 Форумы портала PHP.SU :: Можно ли задать идентификатор равный 0?
Покинул форум
Сообщений всего: 305
Дата рег-ции: Янв. 2012
Помог: 1 раз(а)
Сабж звучит примерно так: Может ли в столбце, который является первичным ключом таблицы, плюс, он еще и AUTO_INCREMENT, хранится значение 0.
Вручную, в таком столбце можно поменять значение, главное, что б оно было уникальным. Я попробовал в такой таблице одной строке присвоить 0, привелось нормально, далее таблица заполняется нормально, автоматически добавляется нужные идентификаторы, все норм. Выбрать из этой таблицы строку с идентификатором 0 тоже выбирает. В общем, работает. Вопрос к знатокам, чем чревато использование строки с идентификатором 0? И вообще, плохо это аль хорошо или вообще нормально это?
EuGen
Отправлено: 29 Июля, 2013 - 10:10:45
Профессионал
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
Ничем не чревато с точки зрения БД. Единственное - полагаться на проверки наподобие
- уже нельзя, нужно использовать более корректные, например, через COUNT
Возможно, ряд других особенностей, связанных со сравнением типов через "==" тоже может возникнуть - зависит от приложения.
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
nkl
Отправлено: 29 Июля, 2013 - 11:02:08
Посетитель
Покинул форум
Сообщений всего: 305
Дата рег-ции: Янв. 2012
Помог: 1 раз(а)
0, NULL и '' это вроде не одно и то же?
EuGen
Отправлено: 29 Июля, 2013 - 11:06:13
Профессионал
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
nkl пишет:
0, NULL и '' это вроде не одно и то же?
В php - да. В MySQL - нет. Сравнение на NULL корректно делать при помощи IS NULL (т.к. NULL не является сравнимой в обычном смысле величиной и означает отсутствие значения). Если у Вас id равен нулю, то из MySQL он и выберется как 0 - но вот дальше, помня правила сравнения php для оператора "==", следует побеспокоиться о том, чтобы верный с точки зрения БД id не сравнивался некорректно с пустой строкой или null, к примеру.
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
quinlena
Отправлено: 29 Июля, 2013 - 13:51:35
Частый гость
Покинул форум
Сообщений всего: 157
Дата рег-ции: Апр. 2012 Откуда: Казахстан
Помог: 0 раз(а)
Лучше использовать -1, так лучше
EuGen
Отправлено: 29 Июля, 2013 - 14:09:42
Профессионал
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
quinlena пишет:
Лучше использовать -1, так лучше
Обоснуйте.
Мои аргументы против этого:
* Как минимум придётся использовать уже знаковый тип данных.
* Нет никакой причины использовать отрицательные значения для id, поскольку они будут такими же числами, а, значит, можно ограничиться и положительными значениями. Вкупе с предыдущим пунктом - положительными id с допустимым интервалом, вдвое большим, чем если использовать отрицательные значения
* Использование отрицательных id обязывает их использовать во всех таблицах-связках или просто связах по ключу, потому как в противном случае несоответствие типов не даст даже построить foreign key, а, если заботиться о целостности на уровне приложения, придётся отказаться от запросов JOIN, поскольку они уже не будут соответствовать реальной структуре данных.
На деле, использовать 0 тоже необязательно, однако это, по крайней мере, не противоречит логике (я сам иногда использую 0 в приложениях для того, чтобы указывать uid=0, gid=0 по аналогии с *nix ОС для детерминирования простых пользователей и root-пользователя, ввиду особенности AND/OR операций с использованием нуля).
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
DeepVarvar
Отправлено: 29 Июля, 2013 - 16:04:47
Активный участник
Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008 Откуда: Альфа Центавра
Помог: 353 раз(а)
EuGen пишет:
(я сам иногда использую 0 в приложениях для того, чтобы указывать uid=0, gid=0 по аналогии с *nix ОС для детерминирования простых пользователей и root-пользователя, ввиду особенности AND/OR операций с использованием нуля)
+1
В моем велосипеде тоже есть root-пользователь и root-группа пользователей айдишники которых равны нулю.
Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011 Откуда: Харьков
Помог: 126 раз(а)
Цитата:
В моем велосипеде тоже есть root-пользователь и root-группа пользователей айдишники которых равны нулю.
-1
нулевой id есть смысл для незарегистрированого юзера. имеется ввиду создание фейкового екземпляра с id = 0 и именем типа "Гость". Для того чтобы не писать if else по всему коду и писать не задумываясь - echo "Здраствуйте, " . $user->username;
для админа таки лучше иметь запись в Бд, к примеру для того чтобы админ мог
сменить пароль как обычный юзер, и авторизация выполнялась опять же однообразно.
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
caballero пишет:
нулевой id есть смысл для незарегистрированого юзера. имеется ввиду создание фейкового екземпляра с id = 0 и именем типа "Гость". Для того чтобы не писать if else по всему коду и писать не задумываясь - echo "Здраствуйте, " . $user->username;
И это тоже- хороший пример использования 0 в качестве id. Но -1 это тоже число, к тому же обладающее перечисленными выше недостатками при использовании в качестве первичного ключа. Речь здесь об альтернативе "ноль" или "не ноль", на фоне чего -1 не даёт накаких преимуществ (нет разницы, -1 или, например, 1000, и то, и другое - не ноль), вместо того порождая проблемы. Поэтому, уверен, -1 и отрицательные значения не следует использовать в качестве первичного ключа (исключая, возможно, редкие случаи, когда того потребует бизнес-логика) upd. Если имелось ввиду "-1", как альтернатива написанному выше "+1", то - здесь всё решает архитектура, кому что удобнее. Мне, к примеру, очень удобно использовать 0 в качестве операнда в логических выражениях, изящно решая проблему root-пользователя и в то же время не порождая многочисленные if-проверки. Кому-то удобнее использовать 0 для гостевого доступа. Сути (то есть применимости 0 в качестве нормального значения первичного ключа) это не меняет.
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
caballero
Отправлено: 29 Июля, 2013 - 16:26:15
Активный участник
Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011 Откуда: Харьков
Помог: 126 раз(а)
да, -1 это как то неестественно
такое иногда используется в некторых API с жесткой типизацией где надо вернуть некое число которое может быть и 0 тоже либо как то указать что ошибка
Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008 Откуда: Альфа Центавра
Помог: 353 раз(а)
caballero пишет:
нулевой id есть смысл для незарегистрированого юзера
Как уже выше сказал EuGen, все решает архитектура приложения, я гостя определяю по приоритету группы, у гостя он равен 1001, что означает самый низший, и так я точно знаю что это гость.
И опять же для существующих или создаваемых групп у меня нельзя указать число приоритета больше 1000.
Покинул форум
Сообщений всего: 305
Дата рег-ции: Янв. 2012
Помог: 1 раз(а)
Не думал что моя темы вызовет стль бурный диспут, всем спасибо. Мне главное что бы потом этот 0 можно было сравнивать вот так $var == 0, $var != 0, $var > 0 и т.д.
DeepVarvar
Отправлено: 29 Июля, 2013 - 21:03:15
Активный участник
Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008 Откуда: Альфа Центавра
Помог: 353 раз(а)
nkl пишет:
$var == 0, $var != 0, $var > 0
именно так и не получится сравнить.
А вот так получится:
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.