Попытка вставить значение DEFAULT в столбец базы данных MySQL
Простой пример
CREATE TABLE test (
id int(11) NOT NULL,
name varchar(10) NOT NULL,
test_date date NOT NULL
) ENGINE=MyISAM;
На mysql я могу сделать
INSERT INTO test(id) VALUES(1);
отлично работает
Теперь я перехожу к drupal 7 и делаю следующее
$data = array('id' => 1);
$result = db_insert('test')->fields($data)->execute();
я получаю следующую ошибку
PDOException: SQLSTATE[HY000]: General error: 1364 Field 'name' doesn't have a default value: INSERT INTO {test} (id) VALUES (:db_insert_placeholder_0); Array ( [:db_insert_placeholder_0] => 1 )
«Режим sql» на MySQL установлен в «» (пустая строка)
Вопросы
- В чем причина возникновения этой ошибки?Ожидается, что drupal (или PDO) будет иметь значения вставки для всех столбцов?
- Допустим, я хочу вставить значение MySQL DEFAULT в столбец даты, как мне это сделать, используя db_insert?
Спасибо
============================================================================= Объяснение после копания в:
- drupal 7 не использует поля даты или даты и времени
- вся его дата хранится в полях INT как метки времени Unix
- это может быть из-за того, что D7 хочет сохранить датуобработка независимо от того, как разные базы данных реализуют поля даты и времени
- Я думаю, что это хорошая практика, позволяющая приложениям обрабатывать преобразование и отображать поле timestamp int
- будет успешно размещаться вплоть до времени UNIX 429496729502/07/2106 6:28 по Гринвичу.(int без знака)
, чтобы увидеть разрешенные типы, вы можете проверить здесь
- file: schema.inc
function:getFieldTypeMap ()
'varchar:normal' => 'VARCHAR',
'char:normal' => 'CHAR',
'text:tiny' => 'TINYTEXT',
'text:small' => 'TINYTEXT',
'text:medium' => 'MEDIUMTEXT',
'text:big' => 'LONGTEXT',
'text:normal' => 'TEXT',
'serial:tiny' => 'TINYINT',
'serial:small' => 'SMALLINT',
'serial:medium' => 'MEDIUMINT',
'serial:big' => 'BIGINT',
'serial:normal' => 'INT',
'int:tiny' => 'TINYINT',
'int:small' => 'SMALLINT',
'int:medium' => 'MEDIUMINT',
'int:big' => 'BIGINT',
'int:normal' => 'INT',
'float:tiny' => 'FLOAT',
'float:small' => 'FLOAT',
'float:medium' => 'FLOAT',
'float:big' => 'DOUBLE',
'float:normal' => 'FLOAT',
'numeric:normal' => 'DECIMAL',
'blob:big' => 'LONGBLOB',
'blob:normal' => 'BLOB',
другая функция, которую вам может быть интересно посмотреть (логика работает так)
- функция createTableSql ()
- function createFieldSql ()
- function processField ()
- function: getFieldTypeMap ()
если вы передадите что-либо, кроме этих, искаженная таблица sql будетне позволяйте создавать саму таблицу
, если у вас уже есть поля базы данных с полями даты и даты и времени в mysql, то вам может потребоваться создать поле метки времени, чтобы сделать его совместимым с D7