我们有一个由 Postgresql v11.4提供支持的 Rails 应用程序,我想在其中添加一个具有默认值和非空约束的新列,如下所示:
ALTER TABLE "blogs" ADD "published" boolean DEFAULT FALSE NOT NULL
我知道添加具有默认值的新列是安全的。但是,与 结合使用它仍然安全NOT NULL
吗?还是会锁定数据库?谢谢!
我们有一个由 Postgresql v11.4提供支持的 Rails 应用程序,我想在其中添加一个具有默认值和非空约束的新列,如下所示:
ALTER TABLE "blogs" ADD "published" boolean DEFAULT FALSE NOT NULL
我知道添加具有默认值的新列是安全的。但是,与 结合使用它仍然安全NOT NULL
吗?还是会锁定数据库?谢谢!
我有一个包含 95929357 条记录的 MySQL 表,下面是相同的表模式
CREATE TABLE `Friends` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`createdTime` datetime DEFAULT NULL,
`friendUserId` bigint(20) DEFAULT NULL,
`friendshipStatus` int(11) DEFAULT NULL,
`remarks` varchar(255) DEFAULT NULL,
`updatedTime` datetime DEFAULT NULL,
`userId` bigint(20) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `userId` (`userId`,`friendUserId`),
KEY `createdTime` (`createdTime`)
) ENGINE=InnoDB AUTO_INCREMENT=1321597934 DEFAULT CHARSET=latin1
我有两个问题要问
问题1# 如果只有95929357条记录,AUTO_INCREMENT怎么增加到1321597934(注意-条目是由默认值为0的代码插入的)。我还注意到,id 存在差距(exp- 从 id 50001124 到新的 id 50001393)
| 50001122 | 2021-09-19 03:33:06 | 116176872 | 0 | NULL | 2021-09-19 03:33:06 | 103802246 |
| 50001123 | 2021-09-19 03:33:06 | 114361519 | 0 | NULL | 2021-09-19 03:33:06 | 116176872 |
| 50001124 | 2021-09-19 03:33:06 | 116176872 | 0 | NULL | 2021-09-19 03:33:06 | 114361519 |
| 50001393 | 2021-09-19 03:33:07 | 109233877 | 0 | NULL | 2021-09-19 03:33:07 | 125715813 |
| 50001394 | 2021-09-19 03:33:07 | 125715813 | 0 | NULL | 2021-09-19 03:33:07 | 109233877 |
| 50001395 | 2021-09-19 03:33:07 | 105588884 | 0 | NULL | 2021-09-19 03:33:07 | 125715813 |
| 50001396 | 2021-09-19 03:33:07 | 125715813 | 0 | NULL | 2021-09-19 03:33:07 | 105588884 |
| 50001397 | 2021-09-19 03:33:07 | 106198652 | 0 | NULL | 2021-09-19 03:33:07 | 125715813 |
| 50001398 | 2021-09-19 03:33:07 | 125715813 | 0 | NULL | 2021-09-19 03:33:07 | 106198652 |
问题 2# 我正在尝试使用以下命令添加新列
ALTER TABLE Friends ADD COLUMN source INT(11) DEFAULT '0';
但是在表更改时低于错误
ERROR 1062 (23000): Duplicate entry '126750770-127846472' for key 'userId'
更新 -
选择上述键的结果
mysql> select * from Friends where userId = 126750770 AND friendUserId = 127846472;
+------------+---------------------+--------------+------------------+---------+---------------------+-----------+--------+
| id | createdTime | friendUserId | friendshipStatus | remarks | updatedTime | userId | source |
+------------+---------------------+--------------+------------------+---------+---------------------+-----------+--------+
| 1120753287 | 2022-01-27 12:36:12 | 127846472 | 0 | NULL | 2022-01-27 12:36:12 | 126750770 | 0 |
+------------+---------------------+--------------+------------------+---------+---------------------+-----------+--------+
1 row in set (0.00 sec)
mysql> select * from Friends where userId = 127846472 AND friendUserId = 126750770;
+------------+---------------------+--------------+------------------+---------+---------------------+-----------+--------+
| id | createdTime | friendUserId | friendshipStatus | remarks | updatedTime | userId | source |
+------------+---------------------+--------------+------------------+---------+---------------------+-----------+--------+
| 1120753288 | 2022-01-27 12:36:12 | 126750770 | 0 | NULL | 2022-01-27 12:36:12 | 127846472 | 0 |
+------------+---------------------+--------------+------------------+---------+---------------------+-----------+--------+
1 row in set (0.00 sec)
我正在使用 Postgresql 12 (AWS RDS) 和 pgAdmin4。
虽然以下语句有效
explain select * from table "Commands";
下一个
explain alter table "Commands" drop column "test";
给出这个错误
LINE 1: explain alter table "Commands" drop column "test";
^
SQL state: 42601
Character: 9
我确保语句alter table "Commands" drop column "test"
本身可以成功运行,所以这不是该语句的问题。
不explain
适用alter
还是我错过了什么?
如果这个问题听起来太基本,首先对不起大家。
我有一个 Wordpress 数据库和一个表wp_comments
。
在此表中,我有两个DATETIME
字段,其默认值为0000-00-00 00:00:00
.
我需要将此值更改为CURRENT_TIMESTAMP
,因此例如我运行以下查询:
ALTER TABLE `wp_comments` MODIFY `comment_date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP;
因此,comment_date
(NOT comment_date_gmt
) 是要修改的列。
现在,当我运行此查询时,我收到以下错误:
Error 1067: Invalid default value for comment_date_gmt
为什么会这样?我能做什么?
[更新]
这是表格:
CREATE TABLE `wp_comments` (
`comment_ID` bigint(20) UNSIGNED NOT NULL,
`comment_post_ID` bigint(20) UNSIGNED NOT NULL DEFAULT '0',
`comment_author` tinytext NOT NULL,
`comment_author_email` varchar(100) NOT NULL DEFAULT '',
`comment_author_url` varchar(200) NOT NULL DEFAULT '',
`comment_author_IP` varchar(100) NOT NULL DEFAULT '',
`comment_date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`comment_date_gmt` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`comment_content` text NOT NULL,
`comment_karma` int(11) NOT NULL DEFAULT '0',
`comment_approved` varchar(20) NOT NULL DEFAULT '1',
`comment_agent` varchar(255) NOT NULL DEFAULT '',
`comment_type` varchar(20) NOT NULL DEFAULT 'comment',
`comment_parent` bigint(20) UNSIGNED NOT NULL DEFAULT '0',
`user_id` bigint(20) UNSIGNED NOT NULL DEFAULT '0'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
ALTER TABLE `wp_comments`
ADD PRIMARY KEY (`comment_ID`),
ADD KEY `comment_post_ID` (`comment_post_ID`),
ADD KEY `comment_approved_date_gmt` (`comment_approved`,`comment_date_gmt`),
ADD KEY `comment_date_gmt` (`comment_date_gmt`),
ADD KEY `comment_parent` (`comment_parent`),
ADD KEY `comment_author_email` (`comment_author_email`(10));
MySQL 版本是 5.7.33
[更新]
我不知道为什么,但我知道我是如何解决这个问题的:
ALTER TABLE `wp_comments` MODIFY `comment_date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, MODIFY `comment_date_gmt` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
这样,通过同时修改两个字段,我不会出错。
它有效,但我仍然很好奇,所以如果有任何想法分享...... :-)
输入:
CREATE TABLE dist
-> SELECT ST_DISTANCE(POINT(x1,y1),POINT(x2,y2))
-> FROM config;
输出:
+------------------------------------------+
| ST_DISTANCE(POINT(x1,y1) , POINT(x2,y2)) |
+------------------------------------------+
| 140.0071426749364 |
| 139.30183056945089 |
| 138.6001443000692 |
| 137.90213921473443 |
| 137.20787149431334 |
+------------------------------------------+
重命名列输入
> ALTER TABLE dist
-> RENAME COLUMN ST_DISTANCE(POINT(x1,y1),POINT(x2,y2)) TO Values;
错误:1064 (42000):您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 2 行的 '(POINT(x1,y1),POINT(x2,y2)) TO Values' 附近使用正确的语法
我正在使用 postgres 13.3,并且我已经有一个现有的表,其中有一GENERATED
列,例如:
CREATE TABLE test_table (
id uuid NOT NULL DEFAULT uuid_generate_v4(),
the_column_to_alter bool NOT NULL GENERATED ALWAYS AS (2 > 1) STORED,
CONSTRAINT test_table2_pkey PRIMARY KEY (id)
);
但我现在改变了主意,我希望这只是一个常规的非生成列,我可以手动编辑......
DROP
重新创建列这可能吗?对列执行此操作的ALTER
查询是什么the_column_to_alter
?
总结问题 我已经得到了 6 个已经创建的表,并被告知要更改这些表的存储参数。我遇到的问题是我只能更改 pctfree、pctused、initrans 和 max trans 而不能更改其他(initial、next、pctincrease 和 maxextents)
提供详细信息和任何研究
我做了很多研究,但其中一些根本不适用于 sql developer。虽然其他人确实有效,但仅针对 4 个存储参数进行了说明。
在适当的时候,描述你尝试过的东西
alter table CUSTOMERS
pctused 20 pctfree 80;
这对这两个非常有效,但我无法添加其他的。从我在网上找到的内容来看,这实际上是唯一对我有用的东西。
我感谢所有输入!
我有一个包含 2.6B 行的表,我需要将一列从 Char(1) 更改为 Varchar(64)。该表超过 300GB,有几个索引。该列可以为空,所以我正在运行的事务是:
ALTER TABLE XXXX ALTER COLUMN YYYYY varchar(64) NULL
我知道这是一个记录操作,所以我将事务日志的大小预先设置为 300GB,认为这已经足够了,尤其是每 5 分钟备份一次日志以允许日志空间重用。由于驱动器空间问题,在我不得不取消交易之前,交易日志增长到 812GB。
我还经历了数据文件 USED 大小的大幅增加,我不知道为什么会这样。使用的数据文件大小正好在 200GB 左右(在这个数据库中完成的事务非常少,所以我知道增加来自这个 alter table 命令)。
我有一些问题:
我正在尝试将列数据类型从更改datetime2
为datetimeoffset
. 我有数据库所有者权限。
每当我运行查询时:
alter table dbo.<my-table>
alter column [TimeStamp] datetimeoffset
我收到以下错误消息:
统计信息“Stat_a41cbd7f968a4cba86199c960f6f7c3a”取决于列“TimeStamp”。
ALTER TABLE ALTER COLUMN 时间戳失败,因为一个或多个对象访问此列。
但是,我的表中似乎不存在此统计信息“Stat_a41cbd7f968a4cba86199c960f6f7c3a” sys.stats
,这很奇怪。
是否有任何其他位置可以定义?
sys.stats
编辑:名为“Stat_a41cbd7f968a4cba86199c960f6f7c3a”的条目中没有一个条目。此外,除了自动统计之外,我从未定义过任何自定义统计。