Я наблюдаю странное поведение, когда я ВСТАВЛЯЮ некоторые данные в таблицу, а затем запускаю запрос SELECT для той же таблицы. Эта таблица имеет первичный ключ с автоинкрементом (uid), и эта проблема возникает, когда я пытаюсь затем выбрать результаты, где «uid IS NULL».
Я свел это к следующим командам SQL:
DROP TABLE IF EXISTS test_users;
CREATE TABLE test_users (uid INTEGER PRIMARY KEY AUTO_INCREMENT, name varchar(20) NOT NULL);
INSERT INTO test_users(name) values('foo');
SELECT uid FROM test_users WHERE uid IS NULL;
SELECT uid FROM test_users WHERE uid IS NULL; -- no output from this query
Я ожидаю, что SELECT uid FROM test_users WHERE uid IS NULL
никогда ничего не вернет, но иногда это происходит. Вот что я нашел:
- Версия MySQL/MariaDB, кажется, имеет значение. На машине с этой проблемой работает MySQL 5.1.73 (CentOS 6.5, как 32-разрядная, так и 64-разрядная версии). На другой моей машине работает 5.5.37-MariaDB (Fedora 19, 64-разрядная версия). Оба работают с конфигурациями по умолчанию, кроме того, что они настроены на использование таблиц MyISAM.
- Затрагивается только первый запрос SELECT после INSERT.
- Если я укажу значение для uid, а не позволю ему автоматически увеличиваться, тогда все в порядке.
- Если я отключаюсь и снова подключаюсь между INSERT и SELECT, я не получаю ожидаемых результатов. Это легче всего увидеть в чем-то вроде Perl, где я управляю объектом соединения. У меня есть тестовый скрипт, демонстрирующий это по адресу https://gist.github.com/avuserow/1c20cc03c007eda43c82.