使用 EXECUTE BLOCK 运行查询来为唯一索引准备一列
2022-05-01
107
我想将表中的一列用作唯一索引。
如果当前记录的数据重复,我的脚本应通过连接记录的 ID 来使数据唯一。
我知道我需要将其放在 EXECUTE BLOCK 中。
EXECUTE BLOCK
AS
DECLARE VARIABLE ID BI;
DECLARE VARIABLE REASON XTXT;
DECLARE VARIABLE LAST_REASON XTXT = '';
BEGIN
FOR SELECT
ID_STATEMENT,
REASON
FROM
STATEMENT
WHERE
ID_STATEMENT > 0
ORDER BY
REASON ASC
INTO :ID,
:REASON
DO BEGIN
IF ( REASON = LAST_REASON ) THEN
UPDATE
STATEMENT
SET
REASON = :REASON || ' X' || :ID
WHERE
ID_STATEMENT = :ID;
END
LAST_REASON = REASON;
END
但是我收到一条错误消息:
-104 Dynamic SQL Error SQL error code = -104 Token unknown - line 18, column 13
第 18 行开始进入部分,第 13 列是 :ID 前面的“:”,
我在 PHP 下尝试了这个,驱动程序是 PDO。
2个回答
据我所知,您希望使字段 REASON 唯一。在本例中,这很简单:
EXECUTE BLOCK
AS
DECLARE VARIABLE ID BLOB;
DECLARE VARIABLE REASON XTXT;
BEGIN
FOR SELECT
REASON || LIST(ID_STATEMENT, 'X'),
REASON
FROM
STATEMENT
WHERE
ID_STATEMENT > 0
GROUP BY
REASON
HAVING
COUNT(*) > 1
INTO :ID,
:REASON
DO BEGIN
DELETE FROM
STATEMENT
WHERE
REASON = :REASON;
INSERT INTO
STATEMENT
VALUES
(:ID, :REASON);
END
END
之后,您将在表中获得具有唯一 REASON 和连接 ID 的记录。
user13964273
2022-05-03
现在我又前进了一步。
冒号的语法问题已经解决。
我不断收到错误消息的原因是因为 INTO 行中的冒号 是我在 PHP 下使用的 PDO 驱动程序中的一个错误。
纯属巧合,在研究另一个主题时,我了解到这个错误自 PHP 版本 5.6 以来就一直存在,至少 在版本 7.3 中尚未消除。
这个“EXECUTE BLOCK”运行良好:
EXECUTE BLOCK
AS
DECLARE VARIABLE ID BI;
DECLARE VARIABLE REASON XTXT;
DECLARE VARIABLE LAST_REASON XTXT = '';
BEGIN
FOR SELECT
ID_STATEMENT,
REASON
FROM
STATEMENT
WHERE
ID_STATEMENT > 0
ORDER BY
REASON ASC
INTO :ID,
:REASON
DO
BEGIN
IF (REASON = LAST_REASON) THEN BEGIN
UPDATE
STATEMENT
SET
REASON = :REASON || ' X' || :ID
WHERE
ID_STATEMENT = :ID;
END
LAST_REASON = REASON;
END
END
驱动程序:PHP Interbase- / Firebird-Driver
重要的是 IF 语句中“THEN”后面的“BEGIN”!!!
Bastian Blanc
2022-05-18