Вставка НУЛЕВОГО значения с помощью запроса бд ИЛИ записи в бд
У меня есть таблица с именем foo_bar, поля которой выглядят следующим образом
id int(10) unsigned NOT NULL AUTO_INCREMENT
name varchar(255) DEFAULT NULL
amount float DEFAULT NULL
Я хочу ввести значение в эту таблицу следующим образом
$name_value = 'Dollar';
$amount = NULL;
db_query("INSERT INTO {foo_bar} (name, amount) VALUES ('%s', %d)", $name_value, $amount_value);
Но теперь, когда я вижу значения в таблице, она показала мне
id | name | amount |
1 | Dollar | 0 |
Я также попробовал db_write_record, как это...
$obj_foo_bar = new stdClass();
$obj_foo_bar->name = 'Dollar'
$obj_foo_bar->amount = ''
Но я получаю тот же результат.
РЕДАКТИРОВАТЬ: 17 сентября 2012
Не используйте drupal_write_record для запросов вставки/обновления, где вы хотите разместить значение по умолчанию равно NULL
ВМЕСТО ЭТОГО: Используйте content_write_record, который используется модулем CCK для обновления таблиц базы данных, если вы хотите установить значение по умолчанию как NULL.
Эта функция говорит, что Напрямую скопирована из записи drupal_write_record ядра, которая не может обновить столбец до НУЛЯ. См. http://drupal.org/node/227677 и http://drupal.org/node/226264 для получения более подробной информации об этой проблеме.
3 answers
NULL
, который вы передаете, возможно/вероятно, интерпретируется как строка, т.Е. "NULL". Когда MySQL преобразует это в значение с плавающей точкой, результатом является 0
.
Если у вас есть значение по умолчанию для столбца, вы можете просто полностью исключить его из запроса, и вы получите ожидаемые результаты:
db_query("INSERT INTO {foo_bar} (name) VALUES ('%s')", $name_value);
Или
$obj_foo_bar = new stdClass();
$obj_foo_bar->name = 'Dollar'
// Leave out $obj_foo_bar->amount
drupal_write_record($table, $obj_foo_bar);
ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Не эксперт по Drupal, просто администратор базы данных MySQL
В своем коде вы пытались ввести значение NULL в числовое поле
Клайв уже дал тебе это
db_query("INSERT INTO {foo_bar} (name) VALUES ('%s')", $name_value);
Однако, чтобы принудительно ввести значение NULL, вы должны ввести его следующим образом
db_query("INSERT INTO {foo_bar} (name,amount) VALUES ('%s',%s)", $name_value);
НЕ
db_query("INSERT INTO {foo_bar} (name,amount) VALUES ('%s',%d)", $name_value);
Другими словами, не используйте %d
в db_query
.
Правильная настройка для использования NULL будет
$name_value = "Dollar";
$amount_value = "NULL";
db_query("INSERT INTO {foo_bar} (name,amount) VALUES ('%s',%s)",$name_value,$amount_value);
Многие ответы здесь рекомендуют вам использовать db_query
для ваших запросов на вставку.
Обратите внимание, что в документах указано;
Не используйте эту функцию для запросов ВСТАВКИ, ОБНОВЛЕНИЯ или УДАЛЕНИЯ. Они должны обрабатываться с помощью db_insert(), db_update() и db_delete() соответственно.
Код также намного элегантнее;
$name_value = 'Dollar';
$amount = NULL;
$fields = array(
'name' => $name_value,
'amount' => $amount,
);
$record = db_insert('foo_bar')
->fields($fields)
->execute();
// $record now contains the new row from the db.
Я знаю, что это старый вопрос, но его стоило опубликовать на случай, если кто-то еще наткнется на него.