标签: virtual-column

连接虚拟列表达式中的数字会引发ORA-12899:值对于列来说太大

虽然我昨天给出了一个问题的答案,但我建议使用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)

oracle numbers sqldatatypes oracle12c virtual-column

8
推荐指数
1
解决办法
1272
查看次数

MySQL SELECT返回错误的结果

我正在使用MySQL 5.7.我创建了一个带有DATETIME类型的虚拟列(未存储)的表,其中包含索引.当我正在研究它时,我注意到order by并没有返回所有数据(我在顶部期待的一些数据丢失了).MAX和MIN的结果也是错误的.我跑完之后

ANALYZE TABLE 
CHECK TABLE
OPTIMIZE TABLE
Run Code Online (Sandbox Code Playgroud)

然后结果是正确的.我想索引数据存在问题,所以我几乎没有问题:

  1. 何时以及为何会发生这种情况?
  2. 有办法防止这种情况吗?
  3. 在我运行的3个命令中,哪个是正确使用的?

我担心将来会发生这种情况,但我不会注意到.

编辑:

根据评论中的要求,我添加了表定义:

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)

mysql sql select virtual-column

7
推荐指数
1
解决办法
1170
查看次数

INSERT INTO ... SELECT 如果目标列具有生成的列

有一些表:

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 中生成错误(由于修复 …

mysql insert-select virtual-column

7
推荐指数
2
解决办法
3426
查看次数

确定 Snowflake 中的列是否为虚拟列

Snowflake 没有记录其使用 AS 子句的虚拟列功能。我正在进行迁移,需要以编程方式过滤掉虚拟列。

有什么方法可以识别一列是虚拟的吗?该Information Schema.COLLUMNS视图显示虚拟列定义和非虚拟列定义之间没有任何区别。

calculated-columns virtual-column snowflake-cloud-data-platform

6
推荐指数
1
解决办法
736
查看次数

有什么方法可以检查java中的列是否是虚拟的?

我想知道是否有什么方法可以检查java中表中的列是否是虚拟的?我正在尝试 ResultSetMetaData 没有运气:

rsmd.isWritable(column);
rsmd.isReadOnly(column);
rsmd.isDefinitelyWritable(column);
Run Code Online (Sandbox Code Playgroud)

我需要检查它是否是虚拟列,以便知道我是否应该插入/修改它,有什么想法吗?

java database oracle jdbc virtual-column

5
推荐指数
1
解决办法
773
查看次数

MySQL 5.6 中生成列的替代方法是什么

我有一个 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 有替代品吗?

mysql sql database mysql-5.6 virtual-column

3
推荐指数
1
解决办法
2273
查看次数

Oracle虚拟列、日期和时间戳

我在 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)

获取数据的问题出在哪里?我尝试了很多格式掩码,但没有任何帮助......

oracle timestamp date virtual-column

0
推荐指数
1
解决办法
2799
查看次数