Вставка НУЛЕВОГО значения с помощью запроса бд ИЛИ записи в бд


У меня есть таблица с именем 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 для получения более подробной информации об этой проблеме.

 2
Author: kiamlaluno, 2012-08-09

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);
 5
Author: Clive, 2012-08-09 14:41:48

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Не эксперт по 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);
 3
Author: RolandoMySQLDBA, 2017-04-13 12:47:08

Многие ответы здесь рекомендуют вам использовать 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.

Я знаю, что это старый вопрос, но его стоило опубликовать на случай, если кто-то еще наткнется на него.

 0
Author: Christian, 2015-09-22 06:39:03