为什么此 Oracle DROP COLUMN 会更改另一列的默认值?

2023-11-27

我们在 Oracle 数据库中的表上遇到了一种奇怪的情况,删除一列会导致更改另一列的默认值。这是场景。

我的表中包含一些示例数据:

select * from SAMPLE_TABLE ;

ID                                       BUSINESS_KEY
---------------------------------------- ---------------
e59bf31c-49a4-4638-bf6e-7d1be60f4dbb                   1
c0dabf78-d9ca-4072-832e-aeb618c7ed14                   2

我添加列TYPE1带有检查约束(类型1_VAL1 or 类型1_VAL2) 和默认值类型1_VAL2 :

alter table SAMPLE_TABLE add TYPE1 varchar(10) default 'TYPE1_VAL2' not null check(TYPE1 in ('TYPE1_VAL1', 'TYPE1_VAL2'));

Table altered.

我看到默认值(类型1_VAL2) 正确填写:

select * from SAMPLE_TABLE ;

ID                                       BUSINESS_KEY    TYPE1
---------------------------------------- --------------- ----------
e59bf31c-49a4-4638-bf6e-7d1be60f4dbb                   1 TYPE1_VAL2
c0dabf78-d9ca-4072-832e-aeb618c7ed14                   2 TYPE1_VAL2

我添加另一列 TYPE2 和另一个检查约束(类型2_VAL1 or 类型2_VAL2) 和默认值类型2_VAL2 :

alter table SAMPLE_TABLE add TYPE2 varchar(15) default 'TYPE2_VAL2' not null check(TYPE2 in ('TYPE2_VAL1', 'TYPE2_VAL2'));

Table altered.

再次看到默认值(类型2_VAL2) 是正确的 :

SYSTEM(SYSTEM) @ DB_USER > select * from SAMPLE_TABLE ;

ID                                       BUSINESS_KEY    TYPE1      TYPE2
---------------------------------------- --------------- ---------- ---------------
e59bf31c-49a4-4638-bf6e-7d1be60f4dbb                   1 TYPE1_VAL2  TYPE2_VAL2
c0dabf78-d9ca-4072-832e-aeb618c7ed14                   2 TYPE1_VAL2  TYPE2_VAL2

现在是奇怪的部分。当我删除第一列时,它似乎将删除的列中的默认值应用到剩余的列上:

ALTER TABLE SAMPLE_TABLE DROP COLUMN TYPE1;

Table altered.

select * from SAMPLE_TABLE ;

ID                                       BUSINESS_KEY    TYPE2
---------------------------------------- --------------- ---------------
e59bf31c-49a4-4638-bf6e-7d1be60f4dbb                   1 TYPE1_VAL2
c0dabf78-d9ca-4072-832e-aeb618c7ed14                   2 TYPE1_VAL2

那么在哪里之前TYPE2列包含类型2_VAL2,在掉落后突然包含类型1_VAL2。就好像已删除列的检查约束移动到了该列。

这种情况发生在我们的测试环境中,我们在 Linux 上运行 Oracle Database 11g 版本 11.2.0.4.0 - 64 位生产版。

在我们本地的 CentOS / Oracle XE 版本上,我们没有这个问题。

知道什么可能导致这种情况以及我们如何防止这种情况发生。这是我们设计的/错误/错误吗?


这是 Oracle 的一个错误。

它是通过添加一个列来触发的NOT NULL约束和一个DEFAULT值到现有表。

为了快速添加列,Oracle 11g 将默认值存储在数据字典中。 Oracle 将此称为“添加列优化”。

这比将默认值写入每个表行要快。然后,查询引擎应该用数据字典中的默认值替换表行中的任何 NULL。不幸的是,有几个与此相关的错误。您的似乎是以下实例:

17325413 删除具有 DEFAULT 值和 NOT NULL 定义的列结束 删除的列数据击中磁盘导致损坏

您可以检查已添加哪些列,如下所示:

 select owner, object_name, name 
 from dba_objects, col$
 where bitand(col$.PROPERTY,1073741824)=1073741824
 and object_id=obj#;

在我们的例子中,我们被一个不同的错误所困扰,该错误返回了错误的结果SELECT FOR UPDATE.

我们设置参数_add_col_optim_enabled=FALSE关闭此“优化”。或者,您也可以升级到已解决这些错误的更高版本的 Oracle。

升级或设置上述参数不会修复已损坏的现有表。您必须重新创建该表。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么此 Oracle DROP COLUMN 会更改另一列的默认值? 的相关文章

  • 我可以从列 CHECK 约束调用用户定义的函数吗?

    我有一个返回 1 或 0 的用户定义的 SQL 函数 我想从列 CHECK 约束中调用它 是的 SQL Anywhere 没有布尔数据类型 因此您必须编写一个生成 TRUE FALSE 或 UNKNOWN 的谓词 换句话说 如果函数返回 1
  • 根据注册后的时间自动删除Wordpress用户?

    在使用用户访问管理器的基本 WordPress 3 1 设置中 是否可以自动删除 x 天前的用户 我没有找到此功能的插件 人们将如何实施这一举措 我是否能够使用 sql 或 php 查询设置一个 cron 作业 从而每天自动从数据库中删除
  • count(distinct) over (partition by... 在 Oracle SQL 中不起作用

    我想数一下distinct day number过去 30 天 但是 distinct 函数不能与over 如果我删除distinct 它会给我总数day number but day number可以有很多重复的 所以这就是为什么我想添加
  • Oracle Text 包含单字符索引搜索不起作用

    我有一个名为 index search 的简单表 创建如下 BEGIN ctx ddl create preference my pref BASIC WORDLIST ctx ddl set attribute my pref SUBST
  • 连接到 SQL Server 数据库 C#-WinForms

    我正在制作一个桌面应用程序 我希望用户必须登录才能充分使用该程序 我已经在 www winhost com 我的网站的托管位置 上创建了一个数据库 但现在我不知道该怎么办 我一直在使用 google 和 msdn 我想知道如何以编程方式将新
  • SQL Server 查看主键

    有没有办法在 sql server 中为视图提供主键 我知道在oracle中这是可能的 我不关心更新它的只读视图 但其他人正在 ms access 中使用它 所以我希望显示我知道正确的约束 是的 您可以创建一个索引视图 http msdn
  • 每组最大 n 个 SQL 查询的高性能方法

    我正在尝试构建一个基础设施 以便根据需要快速运行回归 从包含我们网络服务器上所有历史活动的数据库中提取 apache 请求 为了通过确保我们仍然回归来自较小客户的请求来提高覆盖范围 我想通过为每个客户检索最多 n 个 为了这个问题 假设 1
  • postgresql to_json() 函数转义所有双引号字符

    我编写了一个 plpgsql 脚本 它在字符串中生成一个 json 对象数组 但是在我使用 to json 方法将带有该字符串的变量传递给它之后 它返回一个带双引号的结果 并且每个双引号字符都被转义 但我需要原样的字符串 jsonResul
  • MySQL 更新具有多个值的查询

    我在数据库中有一个表 其记录如下 match id guess result 125 1 0 130 5 0 233 11 0 125 2 0 我的用户为每场比赛选择一个猜测 我有一个函数可以根据比赛的结果计算猜测的结果 如果猜测正确 结果
  • SQL 选择 ID 相同的多个最大行

    我在这方面一次又一次地挣扎 但无法让它发挥作用 在这些论坛上呆了几个小时 数据集 Row Date AccountID Column 1 1 21 02 2013 0 30 A0M8FA1003YP 2 21 02 2013 0 30 A0
  • 无法使用symfony2连接数据库oracle

    我需要的 我需要将oracle数据库与symfony2连接 我已经通过 php m 检查过 oci8 pdo odbc odbc 这是我关注的链接https gist github com johnkary 6481664 https gi
  • 是否可以将普通表与临时表进行左外连接?

    我创建 SQL Server 查询并有一个包含记录的普通表 另一方面有一个包含记录的临时表 该表不为空 并且所有字段都没有任何冲突 加入 可以连接这两个不同类型的表吗 SELECT NormalTable Entityname FROM N
  • 我需要进行哪些更改才能让我的表在 AppEngine 的 BigTable 上运行?

    假设我有一个预订数据库 其中包括users user id fname lname 和他们的tickets ticket id user id flight no 以及相关的flights flight no airline departu
  • MySQL Workbench:如何将 mysql 数据库导出到 .sql 文件?

    我需要将 mysql 工作台中的数据库导出到文件 sql 该怎么办 在 MySql Workbench 版本 8 0 中 您只需按照以下步骤操作即可 Go to Server tab Go to 数据库导出 这会打开类似这样的东西 在中选择
  • 从关键字后的文本中提取字符串

    我想从 SQL 字段中关键字后面的文本中提取内容 我有一个名为Description在表中 该字段的内容是 asdasf 关键字 狗 aeee 关键字 猫 ffffaa 关键词 狼 我想提取并保存 关键字 之后的文本 在本例中dog cat
  • SQL Server 2008 中超前滞后函数的替代

    我想将当前行与下一行中的值进行比较 SQL 有LEAD and LAG函数来获取下一个和上一个值 但我无法使用它们 因为我使用的是 SQL Server 2008 那么我该如何得到这个呢 我有带输出的表 Id ActId StatusId
  • 与派生表的内连接

    我对连接派生表的基本语法有疑问 这是使用的基本语法吗 select from table1 a inner join select from table2 as T1 on 1 ID T1 ID 那行得通吗 您是在问加入两个子查询吗 尝试
  • PHP/MySQL - 在数据库中存储数组

    我正在开发一个 PHP 应用程序 它需要将各种设置存储在数据库中 客户经常询问是否可以添加或更改 删除某些内容 这导致了表格设计出现问题 基本上 我有很多布尔字段 它们只是指示是否为特定记录启用了各种设置 为了避免再弄乱表格 我正在考虑将数
  • 选择具有按两列分组的最大值的行

    我见过很多关于此类问题的解决方案 尤其是这个SQL 仅选择列上具有最大值的行 https stackoverflow com questions 7745609 sql select only rows with max value on
  • Knex 中的表的别名

    我有一个 SQL 查询两次引用同一个表 并且我需要将该表别名为两个单独的别名 我不太清楚如何用 Knex 来编写它 有一个 单词 表和一个 用户 表 Words 表有两个外键 author id 和 winner id 引用 Users 表

随机推荐

  • 使用 @font-face 并在当前 HTML 页面中嵌入 SVG 字体

    我有一个想要分发的独立 HTML 文档 没有任何外部依赖项 我在本文档中使用了非标准字体 只有我的部分用户会安装该字体 对于那些没有安装该字体的用户 我在顶部的嵌入 SVG 文档中包含了该字体的副本 在此示例中我使用的是单字形字体 真实文档
  • 计算 numpy 数组中一行中重复元素的数量

    我正在寻找一种快速方法来执行以下操作 假设我有一个数组 X np array 1 1 1 2 2 2 2 2 3 3 1 1 0 0 0 5 我不是在寻找元素的简单频率 而是在寻找连续的频率 所以第一个 1 重复 3 次 比 2 重复 5
  • Word 2016 中的导航窗格:强制折叠标题视图的 VBA 代码

    我正在尝试编写一个在打开 docx 文档时运行的 VBA 宏 我希望它强制显示导航窗格 然后强制所有标题 任何级别 以折叠模式显示 我正在尝试使用宏记录器获取折叠命令的代码 当我录制宏时 我所拥有的只是 ActiveWindow Docum
  • 类型错误:预期的字符串或缓冲区

    我有这个简单的代码 import re sys f open findallEX txt r lines f readlines match re findall A Z lines print match 我不知道为什么我会收到错误 预期
  • Winforms(.NET Core 3)是否支持所有.NET Framework控件

    我们刚刚迁移到 NET 正在尝试使用 C NET 重新创建一个旧项目 我们听说 NET Core 是新项目的最佳选择 我们对此使用 WinForms 非常感兴趣 所以我一直在尝试 Visual Studio 2019 预览版 16 5 0
  • Gradle:排除依赖项的包

    是否可以排除一个package来自 Android Gradle 依赖项 因此它不会最终出现在 APK 中 As dependencies compile com facebook android facebook android sdk
  • EmptyDataTemplate 和 EmptyDataText 在 GridView 中不起作用

    我似乎也无法得到EmptyDataTemplate or EmptyDataText of a GridView上班 我正在获取GridViewde codebehind 中的内容并使用 using 附加它们DataBind 我试过让它们作
  • Android 共享首选项的默认值

    我正在尝试了解 Android 的 SharedPreferences 我是初学者 并且对此了解不多 我为我的应用程序首选项实现了这个课程 public class Preferences public static final Strin
  • 数组获取比其他值大的最小值

    我有以下数组 float arr 0 0 1f 0 0 1f 0 0 2f 选择大于的最小值的最优雅的方法是什么0或者比其他值大 我尝试过使用Min and Select From OrderBy First 但直到现在还没有运气 使用LI
  • linux perf record:计数(-c)和频率(-F)选项之间的差异

    我试图了解 c 和 F 选项性能记录确实如此 但我无法解释我所看到的 我正在运行这些命令 perf record a F
  • AS3 设置 Sprite 容器的宽度和高度

    好吧 我对这个问题感到困惑 我知道这似乎是一个很简单的问题 我不明白为什么我无法弄清楚 但我仍然无法解决 我几乎放弃了 问题是这样的 我有一个精灵容器 它应该保存一堆视频的缩略图 我可以用所有视频和整个作品填充容器 但显然如果我添加一堆视频
  • 在虚拟环境中使用代理进行 pip 安装

    我在公司笔记本电脑上使用 Ubuntu 虚拟机 它使用代理服务器连接到互联网 经过一番研究 我发现如何使用安装模块pip install与代理 例如 使用此命令我可以安装我的 virtualenv 模块 sudo pip install p
  • 表单字段之间的间距

    我有一个 HTML 表单元素
  • 按行 pandas 具有非空值的第一列名称

    我想知道第一年各个项目的收入 鉴于以下数据框 ID Y1 Y2 Y3 0 NaN 8 4 1 NaN NaN 1 2 NaN NaN NaN 3 5 3 NaN 我想按行返回具有非空值的第一列的名称 在这种情况下 我想返回 Y2 Y3 Na
  • R使用特定编码读取tsv文件

    我正在尝试使用特定编码将 tsv 制表符分隔值 文件读入 R 据说是windows 1252 它有一个标题 对于将其放入数据框中的代码有什么建议吗 也许是这样的 mydf lt read table thefile txt header T
  • 我应该在 viewDidLoad 或 viewWillLayoutSubviews 上初始化 viewController

    我注意到有时在 viewDidLoad 上我得到了正确的视图大小 有时我不这样做 例如 void viewDidLoad super viewDidLoad self pullToRefreshController self pullToR
  • 内部函数无法访问外部函数变量

    我创建了以下 jsfiddle 来突出我的问题 http jsfiddle net UTG7U var ExampleObject function var myArray new Array this example function a
  • 如何从fabricjs画布中删除事件监听器

    我正在使用fabricjs 在html5 中构建交互式地图 当 DOM 加载时 我通过调用 my event setter true 然后为了进行测试 我想在第一次鼠标悬停时通过调用 my event setter false 因此应该删除
  • PDO 获取数据返回字符串数组

    我正在尝试从 MySQL 数据库获取数据PDO但不幸的是PDO以字符串数组形式返回结果 我想在结果数组中保留本机 MySQL 数据类型 我尝试过设置PDO ATTR DEFAULT FETCH MODE二者皆是PDO FETCH ASSOC
  • 为什么此 Oracle DROP COLUMN 会更改另一列的默认值?

    我们在 Oracle 数据库中的表上遇到了一种奇怪的情况 删除一列会导致更改另一列的默认值 这是场景 我的表中包含一些示例数据 select from SAMPLE TABLE ID BUSINESS KEY e59bf31c 49a4 4