我使用以下语法在 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) 鉴于位域只是数据的二进制表示,需要以稍微“奇怪”的方式进行查询。
使用位字段作为布尔值实际上是否有任何好处?从我所见,似乎表明空间是唯一真正的好处。
是否可以暂时禁用触发器,但仅针对一张表。
例如,我有一个表,带有插入、更新和删除触发器的 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 中有一个查询,如下所示。
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 行的一个例外才能搞砸一切。所以我需要一个查询,我可以每隔一段时间执行几次,以查看一个结果集中是否存在不在另一个结果集中的行。
是否可以从变量名称创建表?例如,我正在尝试编写以下存储过程,但它不会使用 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) 是否可以使用游标创建动态表,然后使用这些列聚合 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) 假设 MySQL 5.5 中基于语句的复制和基于行的复制的混合复制。它在 master-master 场景中究竟是如何工作的?
收到查询的 master 是否执行,然后将语句写入 binlog,然后中继到 slave 执行?还是 master 只是简单地写下应该更新的内容,然后 slave 接收更改?
它还指出,在 MySQL 5.5 中 SBR 是默认设置,但在需要时会切换到 RBR。我怎么知道什么时候需要它?有没有办法强制它只对一个查询 UPDATE 或 INSERT 使用 SBR?