首页 \ 问答 \ 默认值如何在数据库中内部工作?(How does default value internally work in Database?)

默认值如何在数据库中内部工作?(How does default value internally work in Database?)

默认值如何在数据库中内部工作?

如果我改变一个表:

alter table foo
add column aws_region varchar(32) default 'us-east-1';

它会更新所有行吗? 或者,如果值不存在,默认值只是值查找?


How does default value internally work in Database?

If I alter a table:

alter table foo
add column aws_region varchar(32) default 'us-east-1';

Will it update all rows? Or is default value is just a value lookup if value is not present?


原文:https://stackoverflow.com/questions/44854543
更新时间:2019-12-07 10:29

最满意答案

这很容易测试出来。 如果向具有一行或多行的表添加列,则会将新列设置为默认值。

mysql> create table foo (id int primary key);

mysql> insert into foo values (123);

mysql> alter table foo
    -> add column aws_region varchar(32) default 'us-east-1';

mysql> select * from foo;
+-----+------------+
| id  | aws_region |
+-----+------------+
| 123 | us-east-1  |
+-----+------------+

如果更改列的定义,则不会更改现有行。 创建行时设置每行中的值,而不是在查询时设置。

mysql> alter table foo 
    -> modify column aws_region varchar(32) default 'us-west-2';

mysql> select * from foo;
+-----+------------+
| id  | aws_region |
+-----+------------+
| 123 | us-east-1  |
+-----+------------+

更改默认值后插入的新行使用新的默认值。 旧行仍具有旧值。

mysql> insert into foo (id) values (456);

mysql> select * from foo;
+-----+------------+
| id  | aws_region |
+-----+------------+
| 123 | us-east-1  |
| 456 | us-west-2  |
+-----+------------+

这意味着在插入行时将默认值复制到行中。 一次只有默认值,因此如果行包含指向默认值的指针,然后我们更改了默认值,则使用默认值的旧行似乎会追溯更改,因为它们现在指向新的默认值。

正如我在上面所展示的那样,他们不这样做。 旧行仍包含在创建行时生效的默认值。 默认值已复制到行中。


It's easy to test this out. If you add a column to a table that has one or more rows, it sets the new column to the default.

mysql> create table foo (id int primary key);

mysql> insert into foo values (123);

mysql> alter table foo
    -> add column aws_region varchar(32) default 'us-east-1';

mysql> select * from foo;
+-----+------------+
| id  | aws_region |
+-----+------------+
| 123 | us-east-1  |
+-----+------------+

If you change the definition of the column, existing rows are not changed. The value in each row is set when you create the row, not when you query it.

mysql> alter table foo 
    -> modify column aws_region varchar(32) default 'us-west-2';

mysql> select * from foo;
+-----+------------+
| id  | aws_region |
+-----+------------+
| 123 | us-east-1  |
+-----+------------+

New rows you insert after the default has been changed use the new default. The old rows still have the old value.

mysql> insert into foo (id) values (456);

mysql> select * from foo;
+-----+------------+
| id  | aws_region |
+-----+------------+
| 123 | us-east-1  |
| 456 | us-west-2  |
+-----+------------+

This means that the default value is copied into the row at the time the row is inserted. There is only default at a time, so if the row contained a pointer to the default, and then we changed the default, old rows that used the default would appear to change retroactively, as they now point to the new default value.

They don't do that, as I showed above. Old rows still contain the default that was in effect at the time the row was created. The default value was copied into the row.

2017-07-05

相关问答

更多

MVC4:ViewModel(带有radiobuttonlist)在HttpPost之后为空(MVC4: ViewModel (with radiobuttonlist) is empty after HttpPost)

我没有看到表单有如下ID的映射: @Html.HiddenFor(model => model.Id) 每个内部问题集合也应该具有Id,以便与表单一起发布。 因此,对于您可以拥有的每个问题,在表单的foreach循环中: @Html.HiddenFor(model => item.Question.Id) 该模型还具有MultipleChoiceQuestion类型的集合。 对于模型绑定到集合,集合元素的名称应具有带有序数字的name属性,如本文http://haacked.com/arch

如何在同一帐户上设置“Dev repo”(在prod和团队之间)(How to set up a “Dev repo” (between the prod and the team) on the same account)

在git中似乎存在一个基本的误解。 您有一个通过设置组织正确找到的回购。 那很棒。 你和你的开发人员在他们的回购中单独分工。 那也没关系。 现在,如果您是首席开发人员,并且想要了解人们的工作方式,那么您可以在GitHub上的中央组织中组织所有这些。 即开发者发送拉动请求并将它们拉入开发分支,您不必将它们拉入主控。 在您的开发分支中,您可以测试合并的代码,看它是否符合您的需求。 如果您不喜欢它,则不必将其与生产和/或主分支合并。 在git中,你使用分支机构来理清好事和坏事。 你批准的所有东西都合并

Php cookie重定向(Php cookie redirect)

如果我理解,在default.php中: if (!isset($_COOKIE["accessCookie"])) { setcookie("accessCookie", 'visited', time()+3600); /* 1 hour */ } else { header('Location: index.html'); } 此代码检查cookie“accessCookie”是否存在:如果不存在,则是用户第一次访问此页面,因此我们创建cookie然后执行default.p

重新排序Magento Onepage结帐步骤(Reorder Magento Onepage checkout steps)

不要修改核心文件,而只是尝试覆盖单页结帐。 要覆盖一页结帐,您可以查看此链接。 http://www.magentocommerce.com/boards/viewthread/34256/ http://www.magentocommerce.com/wiki/5_-_modules_and_development/checkout/customizing_onepage_checkout_-_remove_shipping_method Don't modify the core files

在android中显示“递归评论”的最佳方式?(Best way to display “Recursive Comments” in android?)

您可以使用此库AndroidTreeView ,但我不确定从UX的角度来看这是否是一个很好的解决方案。 我个人更喜欢使用单个ListView并加载具有基础数据列表的新片段。 BreadCrumbs可能是该实践的一个很好的补充,以指示评论级别。 You can use this library AndroidTreeView, but I'm not sure if this is good solution from UX point of view. Personally I prefer t

添加Wordpress评论计数(Add Wordpress comment count)

除非我在代码中遗漏了某些内容,否则任何函数的任何输出都不会使用$commentcount变量。 你尝试过标准方法了吗? http://codex.wordpress.org/Function_Reference/comments_number Unless I'm missing something in your code, the $commentcount variable is not feeded with any output from any function. Have you

JIRA REST API是否支持查询标签列表?(Does the JIRA REST API support querying a list of labels?)

只是为了澄清,标签(至少是内置的JIRA标签)是全球实体,因此它们可以附加到任何项目中的任何问题。 至于你的问题 - 不,没有公共REST端点来获取/更改/添加标签给JIRA。 Just to clarify, labels (at least the built-in JIRA ones) are global entities so they can be attached to any Issue in any Project. As to your question - no, ther

调用函数赋予一些价值(Calling a function with giving some value)

你会给函数一个参数/参数。 所以在伪代码中(我不知道VBA): Function myfunction(myvalue) msgbox myvalue End Function call myfunction(myvalue) 希望能成功。 You would give the function a parameter/argument. So in pseudo code (I dont know VBA): Function myfunction(myvalue) msgb

相关文章

更多

最新问答

更多
  • NumPy标量,广播和__iadd__方法(NumPy scalars, broadcasting and the __iadd__ method)
  • 快速排序算法输出错误(Getting wrong output for quicksort algorithm)
  • Rails管理员:没有Rails 4应用程序的编辑,显示或删除按钮(Rails Admin: No edit, show, or delete buttons for Rails 4 app)
  • 部分刷新问题触发两次(Issue with partial refresh triggered twice)
  • jsPlumb draggable element javascript函数(jsPlumb draggable element javascript function)
  • MVC4:ViewModel(带有radiobuttonlist)在HttpPost之后为空(MVC4: ViewModel (with radiobuttonlist) is empty after HttpPost)
  • 如何在同一帐户上设置“Dev repo”(在prod和团队之间)(How to set up a “Dev repo” (between the prod and the team) on the same account)
  • 如何在tcl中将eth0配置为发送方udp端口(how to configure eth0 as a sender udp port in tcl)
  • EF6.1 beta 1如何获得Tooling Consolidation功能?(EF6.1 beta 1 how to get the Tooling Consolidation feature?)
  • 适用于Windows和PHP 5.5的Phalcon(Phalcon for Windows and PHP 5.5)
  • 有没有办法忽略hg责任中的提交?(Is there a way to ignore a commit in hg blame?)
  • Desire2通过API学习访问学期的权限(Desire2Learn Permissions to Access Semesters Via API)
  • 从aspx将服务器的文件复制到另一台服务器(Copy a file of a server to another server from aspx)
  • 使用YSlow / Web Developer扩展程序确定页面大小(Figuring out page size with YSlow / Web Developer extension)
  • Select语句将字符串中的前7个字符与其他表中的其他7个字符进行比较(Select statement which compares first 7 chars in a string with other 7 chars in other table)
  • 检测对注册表的更改,防止更改等(Detect changes to registry, prevent changes, etc)
  • 用户的鼠标/键盘运动分析是否有特殊名称?(Does the analysis of mouse/keyboard motions of a user have a special name?)
  • 获取Rails中资源的路由列表(Get list of routes for a resource in Rails)
  • 用函数值除以数字(Divide a function value by a number)
  • 熊猫Python:如何从今天开始创建失效列?(Pandas Python: How to create lapse since today column?)
  • GDK Bug报告(GDK Bug Reports)
  • 困惑于在python中循环遍历列表(confused about looping through lists in python)
  • 'less'由'which'输出指定的文件('less' the file specified by the output of 'which')
  • 如何在ASP.NET中优化AJAX(How to optimize AJAX in ASP.NET)
  • 在文本文件中转换纪元时间(Convert epoch times in text file)
  • 表细胞伸展(Table cell stretching)
  • GridView控件(GridView Control)
  • 从构建定义文件控制pdb文件输出(Control pdb file output from build defintion file)
  • *将方法传递给类(*Passing a Method into a Class)
  • 如何在HttpReceiveHttpRequest()中使用HTTPS?(How to use HTTPS with HttpReceiveHttpRequest()?)