当前位置: 首页 > 知识库问答 >
问题:

在sybase ASE中,无法使用Proxy_table命令插入

关翰
2023-03-14

我使用赛贝斯ASE 15.7和面临的问题,而代理表插入默认值。我们希望将数据从源表迁移到目标表,其中目标表在远程服务器中具有具有非空值和默认值的附加列。请参阅以下表格详情。

源表:

CREATE TABLE TABLE_SOURCE
(
COL1 INT,
COL2 INT,
COL3 INT
) 

目标表:

CREATE TABLE TABLE_TARGET
(COL1 INT,
COL2 INT,
COL3 INT,
COL4 INT Default 0 NOT NULL
) 

在源数据库中创建代理表:

CREATE Proxy_Table TAB_TARGET AT 'TGT_SERVER.DB.DBO.TABLE_TARGET' 

在Source中,我们有三个列的详细信息,我们用它来构建查询。

脚本:

INSERT INTO TAB_TARGET (COL1,COL2,COL3) values (1,2,3) 

错误:

The column COL4 in table TAB_TARGET does not allow null values., Error 233, Line 1 

虽然我们已经声明了COL4的默认costraint,但它不接受通过代理表。有没有办法解决这个问题。我们有超过5K表,其中用户正在迁移数据,这个问题存在于100多个表中。

有没有办法插入到目标表中而不出现NOT NULL问题

共有1个答案

冯招
2023-03-14

以下内容显示在参考手册的用法部分:命令:创建代理表:

"列缺省值和规则不通过创建proxy_table导入;请使用创建现有表,其中可以定义列属性。"

注:此参考来自ASE 16手册;我在ASE 15.7 SP100手册中找不到这条评论;我假设ASE 15.7手册编写时忽略了这个细节。

由于您要处理大量的表,我假设您已经准备好了一些脚本来加速迁移过程(并将手动创建5K代理表和相关INSERT语句可能产生的错误降至最低)。

如果这一假设是正确的,并且您不希望创建5K create existing table命令(包括所有那些烦人的列细节)的麻烦,那么我想知道生成带有显式默认值的INSERT语句(相对而言)是否更容易,例如:

INSERT INTO TAB_TARGET (COL1,COL2,COL3,COL4) values (1,2,3,0) 

至于如何在系统表中找到默认值。。。

  • 如果列具有默认值,则syscolumns中的关联记录将在cdefault列(即syscolumns)中存储一个非零值。cdefault

示例:

-- inline default value of '0' assigned to column 'b'
create table t1 (a int, b int default 0 not null, c int)
go

-- standalone default named 'myzero' with default value of '0'; bound to column 'c'
create default myzero as 0
go
sp_bindefault myzero, 't1.c'
go

sp_help t1
go
...
 Column_name ... Default_name
 ----------- ... --------------
 a           ... NULL          
 b           ... t1_b_467529718             -- inline default
 c           ... myzero                     -- standalone default
...

-- contents of syscolumns.cdefault
select name, cdefault from syscolumns where id = object_id('t1') order by colid
go
 name       cdefault
 ---------- -----------
 a                    0
 b            467529718
 c            387529433

-- contents of syscomments.text
select id,text from syscomments where id in (467529718,387529433) order by id
go
 id        text
 --------- ---------------------------
 467529718 DEFAULT  0                       -- inline default
 387529433 create default myzero as 0       -- standalone default

-- pulling this all together:

select col.name, com.text
from   syscolumns  col,
       syscomments com
where  col.id = object_id('t1')
and    col.cdefault = com.id
order by 1
go
 name       text
 ---------- ------------------------------
 b          DEFAULT  0                      -- inline default
 c          create default myzero as 0      -- standalone default

从这里,您应该能够根据syscomments的格式解析出默认值。文本列和实际的默认值(即,它是数字的吗?它是一个字符串,可能带有嵌入的空格吗?它是一个函数引用,例如getdate())。

 类似资料:
  • 前几天我开始开发一个bukkit插件,目的是在用户输入“/hello”时在文本窗口中返回hello。但是,这不起作用,因为我无法在eclipse中导入命令行。有什么建议吗?它说,“命令不能解析为类型”

  • 问题内容: 我正在尝试开发V2插件。我可以在插件配置中使用“ docker plugin create”和“ docker plugin enable”命令。但是,’docker plugin push’命令失败并显示以下错误 这是我的码头工人版本 我已确保该存储库存在并且可以正确访问它。我能够推送其他图像,但只有“ docker plugin push”失败。在调试模式下,docker吐出此错误

  • 问题内容: 问题是 我的配置是 设置conf / hadoop-env.sh 我知道有一个与此问题类似的问题(http://codingdict.com/questions/122917)。但是我已经在这里安装了Sun jdk。因此,任何帮助将不胜感激。 问题答案: 这实际上不是Hadoop问题。Hadoop不使用JPS。 如果找不到JPS,则必须将其放入路径或创建别名。可以在下找到JPS可执行文

  • 我是ImageMagick新手,我只是尝试在命令行中运行convert命令,如下所示: 获取错误消息: 转换:无法打开图像/主页/674390/桌面/罗斯。jpg“:没有这样的文件或目录@错误/blob。c/OpenBlob/2643。转换:此图像格式没有解码委托/home/674390/Desktop/rose。jpg“@错误/构成。c/ReadImage/555。转换:未定义图像“/主页/67

  • 我试图在我的ksh程序的curl命令中使用两个变量,但它不起作用。

  • 它是CentOS 7,已经在我的CentOS中安装了vi和vim,我可以使用它们。我在CentOS中运行docker,当我执行下面这一行时: 我不能在solr容器中使用vi/vim: 为什么会这样?我该如何修复它,以便使用vi/vim在docker容器中编辑文件?