我想在 SQL Server 中创建复制,并将去年更改的记录移至测试环境。由于我添加了过去 1 年的过滤器,因此当复制运行时,仅将过去 1 年的记录添加到开发环境中,并删除开发环境中早于 1 年的记录。
如何将新添加的记录添加到开发环境而不删除开发环境中超过 1 年的记录?
我想在 SQL Server 中创建复制,并将去年更改的记录移至测试环境。由于我添加了过去 1 年的过滤器,因此当复制运行时,仅将过去 1 年的记录添加到开发环境中,并删除开发环境中早于 1 年的记录。
如何将新添加的记录添加到开发环境而不删除开发环境中超过 1 年的记录?
我有以下代码,它会引发错误:
错误:没有与引用表“person”的给定键匹配的唯一约束
DROP TABLE IF EXISTS person;
CREATE TABLE person (
sn serial PRIMARY KEY,
id int NOT NULL,
modified timestamp,
name text
);
CREATE UNIQUE INDEX person_id_key ON person (id) WHERE modified IS NULL;
DROP TABLE IF EXISTS account;
CREATE TABLE account (
id int NOT NULL REFERENCES person(id),
name text
);
有一个唯一索引id
:
Table "public.person"
Column | Type | Collation | Nullable | Default
----------+-----------------------------+-----------+----------+------------------------------------
sn | integer | | not null | nextval('person_sn_seq'::regclass)
id | integer | | not null |
modified | timestamp without time zone | | |
name | text | | |
Indexes:
"person_pkey" PRIMARY KEY, btree (sn)
"person_id_key" UNIQUE, btree (id) WHERE modified IS NULL
为什么外键不够?
我的 MSSQL 数据库表中有以下(以及更多不相关的)列:Id
、ImageUrl
和ImageId
。ImageUrl
和的组合ImageId
可以出现多次。ImageUrl
属于ImageId
,反之亦然。
为了清楚起见,以下示例使用虚拟值,对于真实数据库表 ImageId: int 和 ImageUrl: nvarchar 用作数据类型。
ImageId
a
属于ImageUrl
=的=a.com
可以出现多次,但ImageId
=a
不能用于其他的ImageUrl
。
ImageUrl
=a.com
可以与相同的词一起出现多次ImageId
,但ImageUrl
=a.com
不能与多个 ' 一起出现,ImageId
例如a
and b
。
以下数据必须是可能的:
ID | 图片ID | 图片网址 |
---|---|---|
1 | A | a.com |
2 | A | a.com |
3 | 乙 | b.com |
以下两个示例是不允许的:
ID | 图片ID | 图片网址 |
---|---|---|
1 | A | a.com |
2 | 乙 | a.com |
ID | 图片ID | 图片网址 |
---|---|---|
1 | A | a.com |
2 | A | b.com |
我不知道,也没有找到 MSSQL 解决方案。
问题:有没有解决方案可以在 MSSQL 中强制执行此操作?有没有一个词/术语来表示这种约束/执行?
编辑:这是我现有的包含大量数据的数据库,其中该表是“主”表。我宁愿不通过更改或删除列来更改此表的结构。添加列就好了。这就是为什么 @LeppyR64 的答案不会成为我的用例的解决方案。
我希望 ...
我使用该功能regexp_replace()
。
目前,我可以删除空格,但效果很差。事实上,当属性包含多个空格时,仅删除一个空格。
我无法同时处理1.、2.和3. 。这可能吗?
下面是我的代码的链接:
我想通过链接服务器从 SQL Server 2017 连接到 Oracle 数据库。我从 Oracle-Client-for-Microsoft-Tools-64-bit.exe 安装了 Oracle 驱动程序,但该驱动程序没有出现在链接服务器下的提供程序列表中。重新启动服务器,但仍然没有帮助。我缺少什么?我只从 Oracle 客户端安装程序包安装了 Oracle 驱动程序,因为我认为不需要其他部分。
我正在查看 WordPress 中的表定义查询,并注意到一些奇怪的事情。首先,查询是这样的:
CREATE TABLE $wpdb->comments (
comment_ID bigint(20) unsigned NOT NULL auto_increment,
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',
PRIMARY KEY (comment_ID),
KEY comment_post_ID (comment_post_ID),
KEY comment_approved_date_gmt (comment_approved,comment_date_gmt),
KEY comment_date_gmt (comment_date_gmt),
KEY comment_parent (comment_parent),
KEY comment_author_email (comment_author_email(10))
) $charset_collate;
如您所见,comment_author_email
被定义为varchar(100)
,但其键被定义为 10 个字符的长度。这是为什么?由于大多数电子邮件的长度约为 10-15 个字符,是为了节省空间吗?
在这种情况下,这是否意味着 - 对于长度为 15 个字符的电子邮件 - 前 10 个字符将被索引,其余 5 个字符将不被索引?是这样的吗? (正如您所猜测的那样,我不是数据库专家)。
最后,我将为我正在构建的机制添加一个自己的表,该表需要存储电子邮件地址和电话号码。对于电子邮件地址,我将使用类似的定义。至于手机,为了安全起见,我想将其定义为 varchar(25),但对于其索引,再次使用长度为 10 个字符的密钥。对于这个规划你怎么看?
我是一名来自摩洛哥的年轻的自我思考网络开发人员,简而言之,我正在开发一个特殊的社交媒体项目,我通过该项目学习了编码,但随着时间的推移,它发展成了一个更大的项目。我已经达到了我想为我的帖子创建适当的分析工具的地步
所以这是带有星星评级幻灯片的帖子,我将其存储在带有(user_id,post_id,stars)的sql数据库中,但我想知道每次用户获取帖子时是否都必须count()?或者有一种更有效的方法来显示后期分析,因为我已经阅读了很多内容,但没有找到适合我的案例的解决方案,而且我没有解决这种规模的解决方案的企业经验。每次我请求该帖子时,我都必须计算星星和选民人数的总和,然后我做(星星/选民)以获得平均值,我不知道每次请求该帖子时都进行计数是否是一个好主意,但是我不知道如何以其他方式做到这一点。
我正在 Postgres 15 中使用警报表上的 Timescale 扩展执行以下查询,以获取用户名的最新警报。
EXPLAIN ANALYZE
SELECT *
FROM alerts_alerts
WHERE username IN ('<username_here>')
ORDER BY timestamp DESC
LIMIT 1
对于大多数用户名,查询执行速度很快,不到 150 毫秒。但是,对于某些用户名,需要更长的时间。几乎所有数据库都有大约相同数量的警报,大约 450 个,并且大多数数据库都有相当新的数据,全部在过去 6 个月内。
这是Explain Analyze
有问题的用户名:
"Limit (cost=0.29..2262.68 rows=1 width=86) (actual time=36129.346..36129.370 rows=1 loops=1)"
" -> Custom Scan (ChunkAppend) on alerts_alerts (cost=0.29..2262.68 rows=1 width=86) (actual time=36129.344..36129.368 rows=1 loops=1)"
" Order: alerts_alerts.""timestamp"" DESC"
" -> Index Scan using _hyper_1_234_chunk_alerts_alerts_timestamp_idx_1 on _hyper_1_234_chunk (cost=0.29..2262.68 rows=1 width=89) (actual time=5.795..5.796 rows=0 loops=1)"
" Filter: ((username)::text = 'username_long_query'::text)"
" Rows Removed by Filter: 30506"
" -> Index Scan using _hyper_1_233_chunk_alerts_alerts_timestamp_idx_1 on _hyper_1_233_chunk (cost=0.29..4337.82 rows=1 width=91) (actual time=11.112..11.112 rows=0 loops=1)"
" Filter: ((username)::text = 'username_long_query'::text)"
" Rows Removed by Filter: 59534"
[ ... Cut redundant log lines here ... ]
" -> Index Scan using _hyper_1_156_chunk_alerts_alerts_timestamp_idx_1 on _hyper_1_156_chunk (cost=0.42..11418.54 rows=2591 width=80) (never executed)"
" Filter: ((username)::text = 'username_long_query'::text)"
" -> Index Scan using _hyper_1_155_chunk_alerts_alerts_timestamp_idx_1 on _hyper_1_155_chunk (cost=0.29..7353.95 rows=749 width=84) (never executed)"
" Filter: ((username)::text = 'username_long_query'::text)"
[ ... Cut redundant log lines here ... ]
"Planning Time: 13.154 ms"
"Execution Time: 36129.923 ms"
现在,这是Explain Analyze
快速执行的用户名:
"Limit (cost=471.73..471.73 rows=1 width=458) (actual time=1.672..1.691 rows=1 loops=1)"
" -> Sort (cost=471.73..472.76 rows=414 width=458) (actual time=1.671..1.689 rows=1 loops=1)"
" Sort Key: _hyper_1_234_chunk.""timestamp"" DESC"
" Sort Method: top-N heapsort Memory: 27kB"
" -> Append (cost=0.29..469.66 rows=414 width=457) (actual time=1.585..1.654 rows=210 loops=1)"
" -> Index Scan using _hyper_1_234_chunk_alerts_alerts_fleet_a3933a38_1 on _hyper_1_234_chunk (cost=0.29..2.49 rows=1 width=372) (actual time=0.006..0.007 rows=0 loops=1)"
" Index Cond: ((username)::text = 'username_value'::text)"
" -> Index Scan using _hyper_1_233_chunk_alerts_alerts_fleet_a3933a38_1 on _hyper_1_233_chunk (cost=0.29..2.37 rows=1 width=385) (actual time=0.006..0.006 rows=0 loops=1)"
" Index Cond: ((username)::text = 'username_value'::text)"
[ ... Cut redundant log lines here ... ]
" -> Seq Scan on _hyper_1_83_chunk (cost=0.00..1.12 rows=1 width=504) (actual time=0.013..0.013 rows=0 loops=1)"
" Filter: ((username)::text = 'username_value'::text)"
" Rows Removed by Filter: 10"
" -> Seq Scan on _hyper_1_81_chunk (cost=0.00..1.12 rows=1 width=504) (actual time=0.009..0.009 rows=0 loops=1)"
" Filter: ((username)::text = 'username_value'::text)"
" Rows Removed by Filter: 10"
"Planning Time: 899.811 ms"
"Execution Time: 2.613 ms"
初步研究建议对数据库表进行维护。执行vacuum命令后,再次执行查询,但结果没有变化。
还应该指出的是,还有其他用户名使用“有问题的”规划,但执行时间仍然很快。
不确定如何解决查询执行时间的这种差异。添加另一个索引可能很有用,但由于我是 PostgreSQL 的新手,我目前不确定最好的方法。
考虑以下查询:
select distinct pnumber
from project
where pnumber in
(select pnumber
from project, department d, employee e
where e.dno=d.dnumber
and
d.mgr_snn=ssn
and
e.lname='employee1' and project.pnumber = 2 )
or
pnumber in
(select pno
from works_on, employee
where essn=ssn and lname='employee1' );
我想使用 brin 索引进行测试,因此我删除了所有表上的主键约束并添加了以下索引:
CREATE INDEX idx_brin_pnumber ON project USING brin(pnumber);
CREATE INDEX idx_brin_ssn ON project USING brin(ssn);
CREATE INDEX idx_brin_dnumber ON project USING brin(dnumber);
CREATE INDEX idx_brin_essn ON project USING brin(essn);
我曾经认为原因是连接期间需要 seqScans,但是当我在没有任何索引的情况下运行相同的查询并启用 seqscan 时,它的成本要低得多。那么这是什么原因呢?
我在一个简单的 scylla 集群上有大约 60GB 的数据,我想将它们迁移到 Cassandra 4.1.5。我已经用命令在 scylla 上拍摄了快照
nodetool snapshot -t scylla-20240524 --table <table> <keystore>
我现在尝试将其导入 Cassandra 运行
bin/sstableloader -d localhost -k <keystore> /mnt/scylla-20240524
但我得到以下输出:
Established connection to initial hosts
Opening sstables and calculating sections to stream
Skipping file me-4332-big-Data.db: table <keystore>.scylla doesn't exist
Skipping file me-4333-big-Data.db: table <keystore>.scylla doesn't exist
Skipping file me-4334-big-Data.db: table <keystore>.scylla doesn't exist
Skipping file me-4335-big-Data.db: table <keystore>.scylla doesn't exist
Skipping file me-4400-big-Data.db: table <keystore>.scylla doesn't exist
Skipping file me-4401-big-Data.db: table <keystore>.scylla doesn't exist
Skipping file me-4402-big-Data.db: table <keystore>.scylla doesn't exist
Skipping file me-4403-big-Data.db: table <keystore>.scylla doesn't exist
Summary statistics:
Connections per host : 1
Total files transferred : 0
Total bytes transferred : 0.000KiB
Total duration : 3954 ms
Average transfer rate : 0.000KiB/s
Peak transfer rate : 0.000KiB/s
我在 scylla 模式中找不到“scylla”作为表...我应该做些什么来准备 cassandra 模式?或者还有什么?