大家好,我有 1 个带有以下查询语法的问题
ALTER TABLE table_name
ADD column_name column-definition;
Run Code Online (Sandbox Code Playgroud)
问题是我们可以使用参数来column_name字段@column_name吗?因为我正在创建由前端提供的列名作为参数的列。例如
ALTER TABLE table_name
ADD @column_name varchar(250);
Run Code Online (Sandbox Code Playgroud)
这是给出错误,所以有什么替代方法吗?
在尝试更改 SQL Server 表时添加 DATE 和 FLOAT 列。我收到一条消息:
警告:表“CustomerTransactions”已创建,但其最大行大小超过了允许的最大值 8060 字节。如果结果行超过大小限制,则对该表的 INSERT 或 UPDATE 将失败。
我知道 8K 的限制,但是我很难过,因为桌子没有超过 8K。
DDL 和故障贴在下面。不知道去哪里看得更远。有什么建议吗?
更改表:
ALTER TABLE [dbo].[CustomerTransactions]
ADD
NumericDate FLOAT,
FirstDayOfWeek DATE,
LastDayOfWeek DATE,
NFirstDayOfWeek FLOAT,
NLastDayOfWeek FLOAT,
FirstDayOfMonth DATE,
LastDayOfMonth DATE,
NFirstDayOfMonth FLOAT,
NLastDayOfMonth FLOAT,
HalfMonthStart DATE,
HalfMonthEnd DATE,
NHalfMonthStart FLOAT,
NHalfMonthEnd FLOAT,
HalfOfMonth INT,
FirstDayOfQuarter DATE,
LastDayOfQuarter DATE,
NFirstDayOfQuarter FLOAT,
NLastDayOfQuarter FLOAT,
FirstDayOfYear DATE,
LastDayOfYear DATE,
NFirstDayOfYear FLOAT,
NLastDayOfYear FLOAT
Run Code Online (Sandbox Code Playgroud)
系统列总数
select count(*) NumCols, SUM(sc.length) SumLength
from syscolumns sc
inner …Run Code Online (Sandbox Code Playgroud) 我正在尝试检查添加具有默认值的新列后表大小将如何增加。
我使用以下默认值:NULL, ''(空字符串)和some text(一些随机文本)`但似乎表大小没有改变。
我正在使用以下语句:
EXEC sp_spaceused '[Table_A]';
ALTER TABLE [dbo].[Table_A]
ADD [Loops] NVARCHAR(900)
CONSTRAINT [DF_Loops] DEFAULT('XXX') WITH VALUES;
EXEC sp_spaceused '[Table_A]';
ALTER TABLE [dbo].[Table_A]
DROP CONSTRAINT [DF_Loops]
ALTER TABLE [dbo].[Table_A]
DROP COLUMN [Loops];
Run Code Online (Sandbox Code Playgroud)
但sp_spaceused总是返回:
name rows reserved data index_size unused
------------------------------------------------- -------------------- ------------------ ------------------ ------------------ ------------------
Table_A 73540994 8701688 KB 6658544 KB 2042976 KB 168 KB
Run Code Online (Sandbox Code Playgroud)
谁能告诉我做错了什么?
我正在对 SQL Server 中的约束进行审计。
如何找到所有未启用的约束?
在使用下一个声明之后:
alter table mytable nocheck constraint all
Run Code Online (Sandbox Code Playgroud) 我有一个模式(称为import),其中数据作为表导入,以及一个处理它们的函数。之后我想将这些表移到另一个模式中(称为data_archive)中。现有功能运行良好,但我找不到更改架构的方法;这是我编写的一个函数:
我的想法是根据selecta 为该管理制作的表格提供的标准创建表格列表,然后遍历此列表并执行以下操作Alter table xxxx SET schema data_archive:
CREATE OR REPLACE FUNCTION archive_datasets()
RETURNS VOID AS
$BODY$
DECLARE
table_rec record;
BEGIN
FOR table_rec IN
SELECT t.table_name
FROM information_schema.tables AS t
WHERE table_schema = 'import'
AND quote_ident(t.table_name) IN (
SELECT "table_name"
FROM data_sets
WHERE status IN ('Processed', 'Archived', 'Deleted')
)
LOOP
ALTER TABLE quote_ident(table_rec.table_name) SET schema data_archived;
END LOOP;
END;
$BODY$
LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)
但我收到此错误消息:
Run Code Online (Sandbox Code Playgroud)ERROR: syntax error at or near "(" LINE 28: …
我很难过,我一直在搜索和研究,直到我的浏览器标签不再显示关闭按钮(“X”),直到您将鼠标悬停在它们上面。我一遍又一遍地尝试重写搜索词,但我想我不知道该问什么,所以如果已经回答了这个问题,我深表歉意。
我试图弄清楚如何将一个 INT 列添加到一个表中,该列从 1 开始并根据另一个列值(我们称之为case_id)递增(我们称此字段版本),如果该值与先前迭代的行 - 如果它不相同,则版本值应重置为 1。
我试图通过更新我创建的临时表或在 SELECT INTO 语句期间添加值来解决这个问题。
此表的目的是存储案例的历史更新记录,由case_id列标识,此版本值与修改时间戳的顺序相同。
将此表结构视为源数据的示例:
---------------------------------
| case_id | modify_time |
---------------------------------
| 1 | 2015-05-01 11:12:13 |
| 1 | 2015-05-02 12:13:14 |
| 1 | 2015-05-03 13:14:15 |
| 2 | 2015-05-01 11:12:13 |
| 2 | 2015-05-01 12:13:14 |
| 3 | 2015-05-02 11:12:13 |
---------------------------------
Run Code Online (Sandbox Code Playgroud)
将此作为我想要实现的最终结果的示例:
-------------------------------------------
| case_id | modify_time | version |
-------------------------------------------
| 1 | …Run Code Online (Sandbox Code Playgroud) 我想知道如何确定ALTER TABLE...对给定表进行的最后一次更改 ( ) 是什么时候。
有一个旧答案可用,但不幸的是它不适用于 InnoDB 表。
看看frm文件日期时间,这行得通吗?
-rw-r----- 1 mysql mysql 18622 Oct 24 21:07 mysql/data/mydb/mytable.frm
-rw-r----- 1 mysql mysql 2114688 Oct 28 06:26 mysql/data/mydb/mytable.ibd
Run Code Online (Sandbox Code Playgroud)
Oct 24 21:07似乎大致对应于上次执行结构更改的时间。
那是可靠的信息吗?
例如:
timestamp(tz) 到 int8date 到 int4json 到 text原始数据不变,唯一的区别是数据的处理方式。因此,应该可以干净且即时地来回更改。
我如何检查是否确实如此?
如果不是这种情况(表格被重写),我如何在不重写的情况下做到这一点?
我有一个看起来像这样的代码
declare @query = '
Alter Table Temp
Add NewColumn int
update Temp
set NewColumn = 100'
exec (@query)
Run Code Online (Sandbox Code Playgroud)
它将给出错误 NewColumn 不存在。但如果我在不使用 @query = '' 的情况下正常运行它,它运行得很好。另外,当您使用 @query = ' text ' 然后 exec 运行这样的代码时,它被称为什么?
所以这是永远挂起的查询:
ALTER TABLE tasks
ADD COLUMN in_progress BOOLEAN NOT NULL DEFAULT FALSE;
Run Code Online (Sandbox Code Playgroud)
该表tasks少于 20,000 行,每 5 分钟左右查询一次。
我检查了pg_stat_activity大约 10 次,但从未显示任何锁定表的查询:
SELECT *
FROM pg_stat_activity
WHERE query LIKE '%tasks%';
--- No results
Run Code Online (Sandbox Code Playgroud)
我尝试了真空吸尘器,但没有帮助:
VACUUM (VERBOSE, ANALYZE) tasks;
Run Code Online (Sandbox Code Playgroud)
我还尝试添加没有约束和默认值的列,我希望在这样的表上几乎是即时的,但是当我停止查询时,查询已经运行了 1 分钟:
ALTER TABLE tasks
ADD COLUMN in_progress BOOLEAN;
Run Code Online (Sandbox Code Playgroud)
我在同一时间段内对另一个表(约 1000 行)运行了查询,结果是即时的。
任何想法?
PostgreSQL 11.13
通过 DBeaver 执行的查询(为了以防万一,我多次无效/重新连接)。
alter-table ×10
sql-server ×5
postgresql ×3
ddl ×2
constraint ×1
datatypes ×1
datetime ×1
dynamic-sql ×1
functions ×1
index ×1
innodb ×1
locking ×1
mysql ×1
plpgsql ×1
size ×1
t-sql ×1
table ×1
update ×1