У меня есть база данных MS Access (невыносимо), и я общаюсь с ней через PHP (ODBC).
Есть поле DateTime, которое я должен включить в свой INSERT Это поле НЕ определено как «Обязательное» в Access, что означает, что оно действительно поддерживает NULL, и на самом деле некоторые строки в базе данных Access уже имеют значение NULL.
Проблема, с которой я столкнулся, проста: как вставить NULL через SQL? Все результаты, которые я нашел в Интернете, относятся к этому с помощью чего-то вроде Visual Basic или C #, тогда как я использую SQL через ODBC в PHP.
Я уже пробовал следующее:
INSERT INTO table_name (datetime_field) VALUES (NULL)
INSERT INTO table_name (datetime_field) VALUES (#NULL#)
INSERT INTO table_name (datetime_field) VALUES ('NULL')
INSERT INTO table_name (datetime_field) VALUES ('#NULL#')
INSERT INTO table_name (datetime_field) VALUES ('')
(В моем запросе около 30 других столбцов.)
Точная ошибка, которую я получаю: «Несоответствие типа данных в выражении критерия» при попытке »или NULL. Остальные возвращают ошибку синтаксического анализа (по понятным причинам).
Обратите внимание, что я должен включить поле в оператор INSERT. Поле имеет значение по умолчанию, но во многих случаях исходные данные, которые я транспортирую, имеют значение NULL, которое также должно быть NULL в целевой базе данных.
Заранее спасибо!
Попробуйте просто оставить поле пустым
(values fld1,,fld2)
Попробуйте следующее. У меня это работает:
INSERT INTO sometable ( somedate, somethingelse )
SELECT Null AS Expr1, "foo" AS Expr2;
По сути, вы обертываете нуль в запросе выбора и позволяете SQL выяснить, как представить его во вставке.
- РЕДАКТИРОВАТЬ -
Это ДОЛЖНО также работать:
INSERT INTO sometable ( somedate, somethingelse )
values (Null , "foo");
Но по какой-то причине этого не происходит с моей установкой по умолчанию.
Как я догадываюсь, я переключил свою БД с ANSI-89 на ANSI-92, и метод VALUES начал работать. Я снова переключил его на ANSI-89, и он все еще работает. Мало того, что теперь с ЛЮБОЙ новой базой данных, которую я создаю, она также работает. Странно ... что-то в установке должно быть изменено (и застряло) из-за переключения вперед и назад, это не только ANSI-89/92. Кажется, поэтому мы получали разные результаты.
Вы можете переключить режим работы базы данных, выбрав Логотип Office-> Параметры доступа-> ДИЗАЙНЕРЫ ОБЪЕКТОВ-> ДИЗАЙН ЗАПРОСА. Измените синтаксис, совместимый с SQL Server (ANSI 92) - и отметьте «Эта база данных».
Хорошо, очень странно.
Какие библиотеки вы используете для связи с ODBC?
Может быть проблема с синтаксисом для нулевых значений, с тем, как его интерпретирует библиотека?
Посмотрите, поможет ли эта страница.
Примечание: я не работал с PHP.