小编Mar*_*k D的帖子

从触发器调用存储过程

我使用以下语法在 mysql 中创建了一个存储过程。

DROP PROCEDURE IF EXISTS `sp-set_comment_count`;

DELIMITER $$

CREATE PROCEDURE `sp_set-comment_count` (IN _id INT)
BEGIN
   -- AC   - AllCount
   DECLARE AC INT DEFAULT 0;

   SELECT COUNT(*) AS ac
     INTO AC
     FROM usergroups AS ug
LEFT JOIN usergroup_comments AS ugm ON ugm.`gid` = ug.`id`
LEFT JOIN mediagallery AS dm ON ugm.mid = dm.`id`
    WHERE dm.`status` NOT IN (200, 201, 202, 203, 204, 205)
      AND ug.`id` = _id;

   UPDATE usergroups
      SET allCount = AC,
    WHERE usergroups.`id` = _id;

END $$ …
Run Code Online (Sandbox Code Playgroud)

mysql trigger stored-procedures

17
推荐指数
3
解决办法
10万
查看次数

位与布尔列

鉴于位域只是数据的二进制表示,需要以稍微“奇怪”的方式进行查询。

使用位字段作为布尔值实际上是否有任何好处?从我所见,似乎表明空间是唯一真正的好处。

mysql database-design

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

仅对一张表禁用触发器

是否可以暂时禁用触发器,但仅针对一张表。

例如,我有一个表,带有插入、更新和删除触发器的 TableA。我也有一个具有相同触发器的表 B,但它们只影响表 A 中的某些列。

我现在有一个使用两个表的更新查询。我知道表 A 中的更新需要触发触发器,但表 B 中的更新绝对不需要触发触发器。所以我想禁用这些触发器,直到更新完成。

这可能吗?我正在使用 MySQL 5.1

[附录]

这是一个触发器表A本质上

BEGIN
    IF (OLD.status != 1 AND NEW.status = 2) THEN
        IF (OLD.geo_lat IS NOT NULL AND OLD.geo_long IS NOT NULL) THEN
            DELETE FROM geo WHERE datatype IN (3,4) AND foreignid = NEW.id;
        END IF;
    ELSEIF (OLD.Status = 1 AND NEW.Status != 2) THEN
        IF (NEW.geo_lat IS NOT NULL AND NEW.geo_long IS NOT NULL) THEN
            INSERT INTO geo (datatype, foreignid, long, lat, hostid, morton, status) …
Run Code Online (Sandbox Code Playgroud)

mysql trigger

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

检查 DISTINCT 是否真的有必要

我在 mysql 中有一个查询,如下所示。

SELECT DISTINCT `tableA`.`ColA`, `tableA`.`ColB`, `tableB`.`ColA`, ...
FROM `tableA`
LEFT JOIN `tableB` ON `tableA`.`colC` = `tableB`.`colA`
WHERE <whereconditions>
ORDER BY `tableA`.`ColA` DESC `tableB`.`ColA` ASC
LIMIT 0,20
Run Code Online (Sandbox Code Playgroud)

由于各个表的大小,现在执行查询大约需要 13 秒。但是这个查询要快得多(即 2 秒)

SELECT `tableA`.`ColA`, `tableA`.`ColB`, `tableB`.`ColA`, ...
FROM `tableA`
LEFT JOIN `tableB` ON `tableA`.`colC` = `tableB`.`colA`
WHERE <whereconditions>
ORDER BY `tableA`.`ColA` DESC `tableB`.`ColA` ASC
LIMIT 0,20
Run Code Online (Sandbox Code Playgroud)

我知道这可能会导致不明确的行,但我不确定前端的 php 代码是否已经处理了这种情况。所以我实际上想比较两个结果集的数据,如果不限制的话,这两个结果集都会产生大约 83,000 行。

任何人都可以想出一种在 SQL 中执行此操作而不是通过 php 脚本执行此操作的方法。我已经通过肉眼比较了前 100 行,没有任何问题,但众所周知,只有第 101 行的一个例外才能搞砸一切。所以我需要一个查询,我可以每隔一段时间执行几次,以查看一个结果集中是否存在不在另一个结果集中的行。

mysql

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

从变量名创建表

是否可以从变量名称创建表?例如,我正在尝试编写以下存储过程,但它不会使用 create 语句编译过去。

CREATE DEFINER = 'sabretooth'@'%' PROCEDURE `sp_archive_sabretooth`(
    IN vhost INTEGER(11),
    IN record_age DATETIME,
    IN delete_records BOOLEAN
)
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT ''
BEGIN
    DECLARE done INT DEFAULT FALSE;
    DECLARE i_exist BOOLEAN DEFAULT FALSE;
    DECLARE table_to_create, backup_table_name, database_name VARCHAR(255);
    DECLARE backup_tables_cursor CURSOR FOR 
            SELECT DISTINCT (INFORMATION_SCHEMA.COLUMNS.TABLE_NAME)
                       FROM INFORMATION_SCHEMA.COLUMNS
                      WHERE (INFORMATION_SCHEMA.COLUMNS.COLUMN_NAME LIKE 'vhost%' 
                             OR
                             INFORMATION_SCHEMA.COLUMNS.COLUMN_NAME = 'mid') 
                         AND INFORMATION_SCHEMA.COLUMNS.TABLE_SCHEMA LIKE 'sabretooth%';
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;    

    INSERT INTO sabretooth.debug (message) VALUES …
Run Code Online (Sandbox Code Playgroud)

mysql stored-procedures

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

在 sql server 中使用汇总进行透视

是否可以使用游标创建动态表,然后使用这些列聚合 SQL Server 2008 中的数据?

以下表为例。

CREATE TABLE Billing (
    BillingId BIGINT IDENTITY,
    SubscriptionId BIGINT,
        ExternalServiceName VARCHAR(50),
        BillYear INT NOT NULL,
    BillMonth INT NOT NULL
);

INSERT INTO Billing (BillingId, SubscriptionId, ExternalServiceName,
                     BillYear, BillMonth)
VALUES (1, 1, 'Dogs', 2018, 4),
       (2, 2, 'Cats', 2018, 4),
       (3, 1, 'Dogs', 2018, 5),
       (4, 2, 'Cats', 2018, 5);

CREATE TABLE BillingData (
    BillingDataId INT IDENTITY PRIMARY KEY,
    BillingId INT NOT NULL,
    Feature VARCHAR(50) NOT NULL,
    Usage INT NOT NULL,
    Measurement VARCHAR(50),
    Cost NUMERIC(18,2) …
Run Code Online (Sandbox Code Playgroud)

sql-server-2008 sql-server pivot

3
推荐指数
1
解决办法
2423
查看次数

MySQL SBR 与 RBR

假设 MySQL 5.5 中基于语句的复制和基于行的复制的混合复制。它在 master-master 场景中究竟是如何工作的?

收到查询的 master 是否执行,然后将语句写入 binlog,然后中继到 slave 执行?还是 master 只是简单地写下应该更新的内容,然后 slave 接收更改?

它还指出,在 MySQL 5.5 中 SBR 是默认设置,但在需要时会切换到 RBR。我怎么知道什么时候需要它?有没有办法强制它只对一个查询 UPDATE 或 INSERT 使用 SBR?

mysql replication

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