Временный столбец автоинкремента в Delphi + Zeos, несколько запросов не удалось?

Скажем, у меня есть очень простая таблица:

CREATE TABLE Bands (Name VARCHAR(20) NOT NULL) ENGINE = INNODB;
INSERT INTO Bands VALUES ('Hammerfall'), ('Helloween'), ('Haggard'),
                         ('Therion'), ('Tarja');

И запустите запрос:

SET @i := 0;
SELECT @i := @i + 1 No, Name
FROM Bands
WHERE Name LIKE 'H%'

На HeidiSQL и PhyMyAdmin все работает хорошо:

1 Hammerfall
2 Helloween
3 Haggard

Но в Delphi 2009 произошел сбой с ошибкой

Ошибка SQL: у вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, на предмет правильного синтаксиса для использования рядом с «SELECT @i := @i + 1 No, Name FROM Bands WHERE Name LIKE 'H%'

Я пишу запрос в поле TZQuery.SQL, Query.SQL.Text и Query.SQL.Add(). Все не удалось.

Есть ли способ запустить этот запрос?

Реальный запрос, который я буду использовать, состоит в том, чтобы присоединиться к таблицам с более чем 20 столбцами для создания некоторых отчетов. Но я даже не могу заставить эту крошечную штуку работать ~__~


person Muhammad Yassin Indra Buana    schedule 27.02.2013    source источник
comment
Я не могу проверить это сейчас, но я подозреваю, что проблема заключается в том, что вы выдаете 2 команды sql при одном и том же выполнении запроса. Попробуйте оставить только select предложение и установить @i с myquery.ParamByName('i').AsInteger   -  person Guillem Vicens    schedule 27.02.2013
comment
поскольку вы используете ':' в своем SQL, я уверен, что это та же проблема, что и здесь on-win7-server-2008" title="компонент adodb вызывает нарушение прав доступа на сервере win7 2008"> stackoverflow.com/questions/15103180/. Попробуйте установить для параметра ParamCheck значение false.   -  person bummi    schedule 27.02.2013


Ответы (1)


Как утверждают комментаторы, проблема двоякая.

  1. Вы не можете выполнить 2 оператора в одном SQL (это защита от внедрения SQL).

  2. Вы не можете использовать :, если TQuery.CheckParams = true.

Имейте в виду, что иметь таблицы InnoDB без явных первичных ключей - плохая идея.
Проблема в том, что если вы не создадите PK, MySQL создаст для вас скрытый PK, что значительно снизит производительность соединения.

Если вы хотите, чтобы InnoDB работал эффективно, рекомендуется создать

integer primary key auto_increment

поля в каждой таблице.

person Johan    schedule 27.02.2013
comment
Спасибо за ваш ответ, но: 1. Мне не нужна защита на этом уровне, так как она создается на лету и не требует написания пользователем. 2. Установите значение False, все равно не работает. --- Да, я знаю, что это плохая идея, но это просто образец, я все вырезал. Что мне нужно, так это выбрать запись и сделать ее порядковым списком, эти значения будут в отчете в крайнем левом углу. - person Muhammad Yassin Indra Buana; 28.02.2013