使用 UNION 更新视图将 TINYINT 更改为 BIGINT

Update View with UNION changes TINYINT to BIGINT

我正在通过 UNION 向视图添加信息。我目前在由 TINYINT 表示的 table 中有布尔值。我需要将这些列维护为 TINYINTUNION 中的以下信息将数据类型更改为 BIGINT

<PREVIOUS SELECT (Type of isRequired = TINYINT)>
    SELECT isRequired
    FROM tableA
    UNION
<NEW SELECT (After this, isRequired = BIGINT)>
    SELECT
    1 AS isRequired
    FROM tableB

显然,MYSQL CAST() 不会转换为 TINYINT。如何在原始视图中保留 TINYINT

我不知道你为什么 "need to maintain these columns as TINYINT"。但是 - 一种解决方法是定义一个自定义函数,其中 returns 一个 TINYINT 值。

create function cast2tinyint(v bigint)
  returns tinyint
  deterministic no sql
  return v;

那么您的查询将是

SELECT isRequired
FROM tableA
UNION
SELECT
cast2tinyint(1) AS isRequired
FROM tableA

您可以测试将结果存储到(临时)table。

原查询:

create temporary table tmp1
    SELECT isRequired
    FROM tableA
    UNION
    SELECT
    1 AS isRequired
    FROM tableA
;

show create table tmp1;

结果:

CREATE TEMPORARY TABLE `tmp1` (
  `isRequired` bigint(20) DEFAULT NULL
)

使用自定义函数:

create temporary table tmp2
    SELECT isRequired
    FROM tableA
    UNION
    SELECT
    cast2tinyint(1) AS isRequired
    FROM tableA
;

show create table tmp2;

结果:

CREATE TEMPORARY TABLE `tmp2` (
  `isRequired` tinyint(4) DEFAULT NULL
)

View on DB Fiddle