我正在嘗試將 GENERATED ALWAYS 列添加到將兩個字符解碼為DATE.
它包含一個函式(回傳DATE),但是當運算式被行內時,它的行為例外。該函式在 SELECT 中運行良好。我檢查了我的字符集和排序規則的一致性。
sql_mode 是“ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION”
這是表模式。注意我有一個Location生成的列,它作業正常。
CREATE TABLE `Photo_Gear_Date_Codes` (
`ID` varchar(4) CHARACTER SET latin1 COLLATE latin1_general_cs NOT NULL DEFAULT '....',
`Location` varchar(253) GENERATED ALWAYS AS (case left(`ID`,2) when 'TN' then 'Tatsuno, Hyogo' else 'Unknown' end) STORED,
`Note` varchar(1022) COLLATE latin1_general_ci DEFAULT NULL,
PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci
這是我為簡化事情而定義的函式,盡管當我行內這段代碼時遇到了同樣的錯誤:
CREATE DEFINER=`root`@`127.0.0.1`
FUNCTION `Date_from_OM_date_code`(id3 char(1), id4 char(1))
RETURNS date
DETERMINISTIC
COMMENT 'Decode the last two digits of a four-character OM date code.'
RETURN CONVERT(
concat(
case ID3
when '1' then '1971'
when '2' then '1972'
when '3' then '1973'
when '4' then '1974'
when '5' then '1975'
when '6' then '1976'
when '7' then '1977'
when '8' then '1978'
when '9' then '1979'
when '0' then '1980'
when 'A' then '1981'
when 'B' then '1982'
when 'C' then '1983'
when 'D' then '1984'
when 'E' then '1985'
when 'F' then '1986'
when 'G' then '1987'
when 'H' then '1988'
when 'I' then '1989'
when 'J' then '1990'
when 'K' then '1991'
when 'L' then '1992'
when 'M' then '1993'
when 'N' then '1994'
when 'O' then '1995'
when 'P' then '1996'
when 'Q' then '1997'
when 'R' then '1998'
when 'S' then '1999'
when 'T' then '2000'
when 'U' then '2001'
when 'V' then '2002'
when 'W' then '2003'
when 'X' then '2004'
when 'Y' then '2005'
when 'Z' then '2006'
end,
case ID4
when '1' then '-01-00'
when '2' then '-02-00'
when '3' then '-03-00'
when '4' then '-04-00'
when '5' then '-05-00'
when '6' then '-06-00'
when '7' then '-07-00'
when '8' then '-08-00'
when '9' then '-09-00'
when 'A' then '-10-00'
when 'B' then '-11-00'
when 'C' then '-12-00'
when 'X' then '-10-00'
when 'Y' then '-11-00'
when 'Z' then '-12-00'
end), DATE);
這是我嘗試添加生成的列的方式:
USE `Personal`;
ALTER TABLE `Photo_Gear_Date_Codes` ADD COLUMN `Date` DATE AS
(Date_from_OM_date_code(SUBSTR(`ID`,3,1), RIGHT(`ID`,1))) STORED;
SELECT ID,
`Location`,
Date_from_OM_date_code(SUBSTR(`ID`,3,1), RIGHT(`ID`,1)) `Date`
FROM Photo_Gear_Date_Codes
當我執行這三個陳述句時,第二個會拋出 1901 錯誤代碼:
函式或運算式“
Date_from_OM_date_code()”不能在 GENERATED ALWAYS AS 子句中使用Date錯誤代碼 1901。
但是我繼續解決錯誤,并且SELECT作業正常!
| ID | 地點 | 日期 |
|---|---|---|
| S7Y | 未知 | 1977-11-00 |
| TND1 | 兵庫龍野 | 1984-01-00 |
| TND4 | 兵庫龍野 | 1984-04-00 |
| TNGB | 兵庫龍野 | 1987-11-00 |
| TNH9 | 兵庫龍野 | 1988-09-00 |
| TNI5 | 兵庫龍野 | 1989-05-00 |
| TNJ2 | 兵庫龍野 | 1990-02-00 |
| TNJ3 | 兵庫龍野 | 1990-03-00 |
| TNJ5 | 兵庫龍野 | 1990-05-00 |
| TNM6 | 兵庫龍野 | 1993-06-00 |
| TNM9 | 兵庫龍野 | 1993-09-00 |
| TNOA | 兵庫龍野 | 1995-10-00 |
看起來它應該可以作業......我正在把頭發拉到這個上面!
提前感謝您指出我愚蠢的地方!:-)
uj5u.com熱心網友回復:
正如 mariadb 關于生成列的檔案所說:
此運算式可能會根據表中其他列的值生成值,也可能通過呼叫內置函式或用戶定義函式 (UDF) 來生成值。
UDF 是用 c 撰寫的函式,而不是用 sql 撰寫的函式。如您所見,標準的、基于 sql 的用戶創建函式未包含在串列中,因此出現錯誤訊息。
將您的函式主體作為運算式包含在生成列的代碼中。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/469394.html
上一篇:在imdb資料集中的where子句中使用時無法在Mysql中提取日期
下一篇:替換python中字串的日期部分
