admin

通过视图查看MySQL Tinybit(1)列

sql

我有一个连接2个表的视图。其中一个表具有一列tinyint(1)类型的列,该列表示一个布尔值。

联接时,该表并不总是具有条目,因此,当缺少行时,视图需要采用0(假)值。我希望视图公开TINYINT(1)和NOT
NULL类型的列,因为它将始终具有默认值0,但是我没有成功。

请参阅下面的SQL重现该问题。

CREATE TABLE TEST1 (
    ID bigint(20) NOT NULL AUTO_INCREMENT,  
    PRIMARY KEY (ID)
) ENGINE=InnoDB AUTO_INCREMENT=10202961 DEFAULT CHARSET=utf8;

CREATE TABLE TEST2 (
    TEST1_ID bigint(20) NOT NULL, 
    MY_BOOLEAN TINYINT(1) NOT NULL DEFAULT '0' 
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;

DROP FUNCTION get_tinyint_zero;
CREATE FUNCTION get_tinyint_zero() RETURNS TINYINT(1) RETURN 0;

CREATE OR REPLACE VIEW TEST_VIEW
AS
    SELECT 
        T1.ID AS ID,
        COALESCE(T2.MY_BOOLEAN, get_tinyint_zero()) AS MY_BOOLEAN
    FROM
        TEST1 T1 LEFT JOIN TEST2 T2 ON T1.ID=T2.TEST1_ID;

DESC TEST2;
DESC TEST_VIEW;

在TEST2中

# Field, Type, Null, Key, Default, Extra
'MY_BOOLEAN', 'tinyint(1)', 'NO', '', '0', ''

在TEST_VIEW

# Field, Type, Null, Key, Default, Extra
'MY_BOOLEAN', 'int(4)', 'YES', '', NULL, ''

阅读 173

收藏
2021-06-07

共1个答案

admin

https://www.db-fiddle.com/f/igDh3aJEXRLZEkL7eNrcnc/0

CREATE FUNCTION get_tinyint(MY_BOOLEAN tinyint) RETURNS TINYINT(1) 
RETURN COALESCE(MY_BOOLEAN, 0);

CREATE OR REPLACE VIEW TEST_VIEW AS
SELECT 
    T1.ID AS ID,
    get_tinyint(T2.MY_BOOLEAN) AS MY_BOOLEAN
FROM
    TEST1 T1 LEFT JOIN TEST2 T2 ON T1.ID=T2.TEST1_ID;
2021-06-07