虽然我昨天给出了一个问题的答案,但我建议使用VIRTUAL COLUMN来计算值而不是手动更新它.
我自己做了一个测试,并找出了在连接两个NUMBER类型列时虚拟列表达式所占用的数据大小的问题.虽然,在连接两个字符时没有问题.
数据库版本:
SQL> select banner from v$version where rownum = 1;
BANNER
--------------------------------------------------------------------------------
Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production
SQL>
Run Code Online (Sandbox Code Playgroud)
测试用例1:连接字符串
SQL> CREATE TABLE t(
2 ID varchar2(2),
3 num varchar2(2),
4 text VARCHAR2(10) generated always as (id||'_'||num) VIRTUAL
5 );
Table created.
SQL>
SQL> INSERT INTO t(ID, num) VALUES ('a', 'e');
1 row created.
SQL> INSERT INTO t(ID, num) VALUES ('b', 'f');
1 row created. …Run Code Online (Sandbox Code Playgroud) 我正在使用MySQL 5.7.我创建了一个带有DATETIME类型的虚拟列(未存储)的表,其中包含索引.当我正在研究它时,我注意到order by并没有返回所有数据(我在顶部期待的一些数据丢失了).MAX和MIN的结果也是错误的.我跑完之后
ANALYZE TABLE
CHECK TABLE
OPTIMIZE TABLE
Run Code Online (Sandbox Code Playgroud)
然后结果是正确的.我想索引数据存在问题,所以我几乎没有问题:
我担心将来会发生这种情况,但我不会注意到.
编辑:
根据评论中的要求,我添加了表定义:
CREATE TABLE `items` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`user_id` bigint(20) unsigned DEFAULT NULL,
`image` json DEFAULT NULL,
`status` json DEFAULT NULL,
`status_expired` tinyint(1) GENERATED ALWAYS AS (ifnull(json_contains(`status`,'true','$.expired'),false)) VIRTUAL COMMENT 'used for index: it checks if status contains expired=true',
`lifetime` tinyint(4) NOT NULL,
`expiration` datetime GENERATED ALWAYS AS ((`create_date` + interval `lifetime` day)) VIRTUAL,
`last_update` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, …Run Code Online (Sandbox Code Playgroud) 有一些表:
CREATE TABLE `asource` (
`id` int(10) unsigned NOT NULL DEFAULT '0'
);
CREATE TABLE `adestination` (
`id` int(10) unsigned NOT NULL DEFAULT '0',
`generated` tinyint(1) GENERATED ALWAYS AS (id = 2) STORED NOT NULL
);
Run Code Online (Sandbox Code Playgroud)
我从asourceto复制一行adestination:
INSERT INTO adestination
SELECT asource.*
FROM asource;
Run Code Online (Sandbox Code Playgroud)
以上产生一个错误:
Error Code: 1136. Column count doesn't match value count at row 1
Run Code Online (Sandbox Code Playgroud)
好的,要求我提及生成的查询很奇怪。但是好的,我将该列添加到查询中:
INSERT INTO adestination
SELECT asource.*, NULL AS `generated`
FROM asource;
Run Code Online (Sandbox Code Playgroud)
这在 5.7.10 中运行良好。但是,它会在 5.7.11 中生成错误(由于修复 …
Snowflake 没有记录其使用 AS 子句的虚拟列功能。我正在进行迁移,需要以编程方式过滤掉虚拟列。
有什么方法可以识别一列是虚拟的吗?该Information Schema.COLLUMNS视图显示虚拟列定义和非虚拟列定义之间没有任何区别。
calculated-columns virtual-column snowflake-cloud-data-platform
我想知道是否有什么方法可以检查java中表中的列是否是虚拟的?我正在尝试 ResultSetMetaData 没有运气:
rsmd.isWritable(column);
rsmd.isReadOnly(column);
rsmd.isDefinitelyWritable(column);
Run Code Online (Sandbox Code Playgroud)
我需要检查它是否是虚拟列,以便知道我是否应该插入/修改它,有什么想法吗?
我有一个 MySQL alter 语句
ALTER TABLE `employee`
ADD `employee_name_generator` CHAR(20) GENERATED ALWAYS AS
(COALESCE(concat(`employee_name`), '^')) VIRTUAL;
Run Code Online (Sandbox Code Playgroud)
这是添加employee_name_generator唯一约束所必需的。这在 MySQL 5.7 以后工作正常。但是我需要它的环境有 MySQL 5.6。MySQL 5.6 有替代品吗?
我在 Oracle 中遇到虚拟列问题(我需要从日期列开始的时间戳);这是我的例子:
CREATE TABLE TBDATETIME(
DATETIME_1 DATE,
DATETIME_2 TIMESTAMP(9) GENERATED ALWAYS AS (
CAST( TO_CHAR(DATETIME_1, 'DD/MM/YYYY HH24:MI:SS')
|| '.' || TO_CHAR(DATETIME_1, 'FF9') AS TIMESTAMP(9))
) VIRTUAL
);
INSERT INTO TBDATETIME(DATETIME_1)
VALUES(SYSDATE);
COMMIT;
SELECT *
FROM TBDATETIME;
ORA-01821: date format not recognized
01821. 00000 - "date format not recognized"
*Cause:
*Action:
Run Code Online (Sandbox Code Playgroud)
获取数据的问题出在哪里?我尝试了很多格式掩码,但没有任何帮助......