小编dez*_*zso的帖子

如何在 MySQL 触发器中构造 IF 条件?

我正在尝试编写一个 MySQL 触发器。我有两张这样的表:

Table A------------------------------Table B

order_id--------sku---------------order_id----order_#----sku_copy

    568---------AAA---------------568---------2345
    567---------BBB---------------567---------6789-------empty column
    566---------CCC---------------566---------1234
Run Code Online (Sandbox Code Playgroud)

当客户进行购买时,每张表都会添加一条新记录。我已将列“sku_copy”添加到表 B,因此在创建新记录时不会填充它。

创建新记录时,我希望触发器将表 A 中的“sku”字段复制到表 B 中的“sku_copy”字段。但是,我遇到的问题是如何在触发器中构造以下条件。

如果:表 A 中的“order_id”与表 B 中的“order_id”匹配。然后:将表 A 记录中的“sku”复制到表 B 中具有匹配“order_id”的记录。数据应添加到表 B 'sku_copy'。

我正在使用以下 SQL 触发器,但在运行时出现此错误:

“#1363 - INSERT 触发器中没有 OLD 行”

这是触发器:

DELIMITER $$
CREATE TRIGGER trigger_name
    AFTER INSERT ON tableA
    FOR EACH ROW BEGIN

    INSERT INTO tableB
    SET sku_copy = OLD.sku,
         order_id = OLD.order_id,
        order = OLD.order;
END $$
DELIMITER ;
Run Code Online (Sandbox Code Playgroud)

有人可以告诉我如何更正此代码中的错误或提出更好的建议吗?

感谢您提供的任何帮助。

这是一个更新:

我试过这个触发器(这是实时数据而不是上面例子中的简化)但得到一个错误代码:

“#1064 - 您的 SQL 语法有错误;请检查与您的 MySQL 服务器版本相对应的手册,以了解在第 …

mysql trigger

5
推荐指数
1
解决办法
9万
查看次数

还原数据库 SQL Server 2012

我是 SQL Server 的新手,如果有人能指出我正确的方向会很有帮助。

我们有一个名为main-db.bak.

这是我们克隆的数据库文件,因为它包含我们在为客户构建新网站的过程中需要的所有主要内容。是否可以执行以下操作:

  1. 在同一个 SQL Server 实例上拥有数据库的副本
  2. 创建一个新的空数据库
  3. main-db.bak文件中恢复数据库而不覆盖可能使用相同数据 MDF 和 LDF 文件的其他任何内容?

或者从实时运行的数据库副本中复制此数据库是否更容易,以便在从备份中恢复时不需要?

恢复数据库时是否必须重命名 LDF 和 MDF 文件,我可以编写脚本来自动执行大部分工作吗?

sql-server sql-server-2012

5
推荐指数
1
解决办法
3275
查看次数

是否可以在两个不同的域上进行复制?

我正在不同的地理位置之间实现数据库复制,其中每个位置都在不同的域中。完成所有过程后,当我启动代理时,它会运行并停止。

当我查看详细信息时,它显示:

Error messages:
The process could not connect to Subscriber 'Mydomain\myusername'. (Source: MSSQL_REPL, Error number: MSSQL_REPL20084)

Login failed. The login is from an untrusted domain and cannot be used with Windows authentication. (Source: MSSQLServer, Error number: 18452)
Run Code Online (Sandbox Code Playgroud)

replication sql-server transactional-replication

5
推荐指数
1
解决办法
2万
查看次数

存储过程本身死锁

我有一个奇怪的情况,从日志中看到:

Process 37278 waits for ExclusiveLock on advisory lock [16421,999999,12864385,2]; blocked by process 53807. 
Process 53807 waits for ExclusiveLock on advisory lock [16421,999999,12864395,2]; blocked by process 37278. 
Process 37278: SELECT * FROM zel_api.insert_event ($1 ,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16,$17,$18,$19,$20,$21,$22,$23,$24) 
Process 53807: SELECT * FROM zel_api.insert_event ($1 ,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16,$17,$18,$19,$20,$21,$22,$23,$24)",
"See server log for query details.",,,"SQL statement ""SELECT pg_advisory_xact_lock(999999, format('zel_event.%I', p_table_name)::regclass::oid::integer)""
Run Code Online (Sandbox Code Playgroud)

这本身就已经很奇怪了,因为看起来两个进程阻塞了同一个咨询锁,但实际上都不能抓住它。

尝试获取锁的函数如下:

CREATE OR REPLACE FUNCTION zel_event.create_new_partition(
    p_table_name text
)
RETURNS void AS
$BODY$
DECLARE
    _schema text;
BEGIN
    IF NOT EXISTS (table from catalog)
    THEN
        PERFORM …
Run Code Online (Sandbox Code Playgroud)

postgresql trigger deadlock postgresql-9.2

5
推荐指数
1
解决办法
1037
查看次数

PostgreSQL 可以通过某种一次性覆盖来支持集成测试吗?

编写包含数据库的集成测试是一个常见问题。如果测试更改了数据库,那么它可能会影响其他测试或下一次运行。

我知道我可以将我的测试包装在一个事务中并在测试运行后回滚该事务。但是如果 PostgreSQL 能够提供某种全局快照或一次性覆盖,那就太好了。在理想情况下,这样的功能将涵盖数据库的所有状态,包括模式和存储过程。

postgresql testing snapshot unit-test integration

5
推荐指数
1
解决办法
1153
查看次数

如何只导出 MySQL 数据库的结构?

我使用 Ubuntu 14.10 和 PhpMyAdmin。

我有一个“大”MySQL 数据库,大小为 900MB。我只需要该数据库的结构,以便在本地计算机上使用它。如何仅导出结构?

mysql phpmyadmin export ubuntu

5
推荐指数
1
解决办法
2万
查看次数

AlwaysOn 群集的“跳过数据库的默认启动”SQL 通知

所以我设置了我们的 SQL 服务器来通知我们严重程度为 17 或更高的警报(如各种 SQL Server 文章所建议的那样)。我对具有三个多子网节点的 SQL Server Always On Availability Cluster 的每个节点都执行了此操作。

上周末,我们从一个辅助节点收到了近一百条关于一条“仅供参考”消息的通知。其他节点没有这样做,警报似乎没有引起任何实际问题。警报是:

DESCRIPTION:    Skipping the default startup of database '<database>' because the database belongs to an availability group (Group ID: <...>). 
The database will be started by the availability group. 
This is an informational message only. No user action is required.
Run Code Online (Sandbox Code Playgroud)

可能的罪魁祸首:我们的网络存在一些问题,节点可能正在断开连接并重新连接或超时。

我想我的问题是,是否应该采取任何措施来解决此警报?为什么它只影响我的一个节点?如果它确实是信息性的并且不需要采取任何措施,我可以配置我的警报以忽略这些警报吗?

根据评论,我查看了日志,似乎服务器一直在运行,但在那个时候它与始终在线的服务器断开了连接:

AlwaysOn Availability Groups: Local Windows Server Failover Cluster node is no longer online.  
The Availability replica is going offline because …
Run Code Online (Sandbox Code Playgroud)

sql-server clustering sql-server-2012 availability-groups

5
推荐指数
1
解决办法
5139
查看次数

SELECT + INSERT 或单独插入

我有一个应用程序,其中有几台设备每秒向我的服务器发送数据。在数据库上,我有一个包含设备的表和另一个每秒发送数据的表。

设备第一次发送数据时,服务器脚本应INSERT在设备表中注册 ( ) 该设备 ID 并将数据添加到数据表中。

我的问题是,什么会更快?

  1. 执行SELECT EXISTS查询以确定INSERT设备表中是否需要一个。如果SELECT EXISTS返回 false 则执行 an INSERT,否则什么都不做。

  2. 总是执行一个INSERT语句。考虑到设备 id 是表上的主键,如果设备已经存在它会返回一个错误,否则它会插入它。

只有第一次设备发送数据时才需要一个实际的INSERT,之后INSERT就不需要了。

PostgreSQL 版本是 9.4。

设备表定义如下:

CREATE TABLE common.tag
(
  customer integer,
  hostname character varying(150),
  description text,
  model integer,
  configprofile integer,
  id character varying(150) NOT NULL,
  host integer,
  CONSTRAINT tag_pk PRIMARY KEY (id),
  CONSTRAINT tag_fk_client FOREIGN KEY (customer)
      REFERENCES common.customer (id) MATCH SIMPLE
      ON UPDATE NO ACTION ON …
Run Code Online (Sandbox Code Playgroud)

postgresql insert select referential-integrity

5
推荐指数
1
解决办法
2710
查看次数

在 Postgresql 中处理分区表

由于历史原因,我们过去常常在 Postgresql 数据库中使用一个非常大的表来存储基于时间的一系列测量值。经过长时间的使用,当表的大小达到 200+ GB 时,我们决定对其进行一些清理,比如只保留 90 天的数据,以加快速度并节省一些磁盘空间。

问题是,这样做delete from ... where clock_column < ...不会回收磁盘上的任何空间,因此我们需要VACUUM FULL在删除后保留它们。

由于我们无法承受如此长的时间停止数据库,因此我们决定采用分区方法并创建每日表,以便我们能够在时间到期时将它们一一删除。所以现在我们有了table(最初的、巨大的),并以 date 命名table160101table160102等等。

现在我想做:

  1. 初始表的备份(仅初始表)

    2.1 在其中进行一些清理(仅在其中)或

    2.2 也许简单地截断它(仅它)

但当我进行测试时,我看到COPY table TO 'file'创建了整个表的转储(两者和table全部等)。同样的方式,清除整个表,而不是第一个表(在测试服务器上测试)。table160101table160102TRUNCATE

当我在 中使用分区表时SELECT,我可以简单地说明ONLY选择要使用的表。但我找不到在COPYor中做到这一点的方法TRUNCATE

所以问题是:如何在不牺牲表中数据的情况下归档我的目标?

PS 我需要归档的是,当所有“每日”数据都在“每日”表中时,我只是不喜欢保留带有非常旧数据的初始大表。事实上,TRUNCATE唯一的想法就是好主意。

postgresql partitioning

5
推荐指数
1
解决办法
3807
查看次数

在 AWS RDS (Postgres) 中移动扩展

最初,我们在默认的“公共”架构中安装了所有扩展。现在我们有越来越多的其他模式 - 因此我们希望向模式添加扩展和通用功能common

不幸的是,AWS RDS 在尝试像这样移动现有的时会报告:

ALTER EXTENSION "hstore" set schema common;

DBCException: SQL Error [42501]: ERROR: must be owner of extension hstore
  org.postgresql.util.PSQLException: PSQLException: ERROR: must be owner of extension hstore
Run Code Online (Sandbox Code Playgroud)

我正在使用也是角色成员的默认用户rds_superuser

postgresql amazon-rds

5
推荐指数
0
解决办法
1458
查看次数