2016-01-24 5 views
0

Учитывая простой запросMySQL против SQLite: прибавка с пустой строки первичного ключа

$query = 'INSERT INTO `menu` (`id`,`name`,`value`) VALUES (:id,:name,:value);'; 

и вводно-Params массив

$params = [':id' => '', ':name' => 'John', ':value' => 'ABC']; 

где id является столбец PRIMARY KEY и AUTOINCREMENT. В mysql столбец id автоинкремлен, даже если переданное значение представляет собой пустую строку ''; то же самое не относится к SQLite, так как ошибка генерируется

SQLSTATE[HY000]: General error: 20 datatype mismatch 

Вопрос: Есть ли способ заставить SQLite для увеличения поля первичного ключа при условии, пустая строка?

Фон из docs:

на вставке, если ROWID или целочисленное ПЕРВИЧНЫЙ столбца KEY не явно присвоено значение, то оно будет заполнено автоматически неиспользуемом целое число, как правило, один больше, чем самый большой ROWID, который в настоящее время используется.

и

Если нет ROWID не указано на вкладыше, или если указанный ROWID имеет значение NULL, то соответствующий ROWID создается автоматически.

+0

'$ query = 'INSERT INTO menu (' name ',' value ') VALUES (: name,: value);';' и '$ params = [': name' => 'John', ' ': value' => 'ABC']; ' –

+0

@ A-2-A да, я знаю об этом. Тем не менее я хотел бы сохранить пустой параметр. – sitilge

+0

Это невозможно, потому что это столбец 'primary' и' auto-incremented'. 'primary' не принимает нулевые значения. –

ответ

1

Вы должны либо передать значение null для поля auto_increment, либо не указывать его вообще. Для mysql, проходящего пустую строку, работает только с определенными параметрами конфигурации и работает, потому что mysql бесшумно преобразует пустую строку в 0, поэтому вы не должны полагаться на нее или ожидать каких-либо других rdbms последовать ее примеру. документация

знакомства MySQL на no_auto_value_on_zero sql mode подробности:

NO_AUTO_VALUE_ON_ZERO влияет на обработку столбцов AUTO_INCREMENT. Обычно вы создаете следующий порядковый номер для столбца на , вставляя в него NULL или 0. NO_AUTO_VALUE_ON_ZERO подавляет такое поведение для 0, так что только NULL генерирует следующую последовательность номер.