开发者问题收集

使用 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