Delete rows from one table in multiple databases? - mysql

I have multiple databases, and each of the databases have some tables in common. I'd like to do something like DELETE FROM *.table_name WHERE col_name LIKE 'value'; followed by OPTIMIZE TABLE *.table_name;
Is this possible with a single MYSQL query, or will I need to run these queries individually across each database?

If you have three databases with the table mytable, this might do it
DELETE A.*,B.*,C.*
FROM db1.mytable A,db2.mytable B,db3.mytable C
WHERE A.col_name LIKE 'value'
AND B.col_name LIKE 'value'
AND C.col_name LIKE 'value';
OPTIMIZE TABLE db1.mytable,db2.mytable,db3.mytable;
Give it a Try !!!
UPDATE 2013-05-31 18:27 EDT
I have a solution based on the INFORMATION_SCHEMA database and Dynamic SQL.
SOLUTION
USE db1
SET #GivenTable = 'mytb';
SET #GivenCol = 'dat';
SET #GivenValue = 'Burger King';
SET #x = 0;
SELECT GROUP_CONCAT(dbtb) INTO #OptimizeTableList
FROM (SELECT CONCAT(db,'.',tb) dbtb,CONCAT('dbalias',num) dbalias
FROM (SELECT table_schema db,table_name tb,(#x:=#X+1) num,column_name col
FROM information_schema.columns WHERE table_name=#GivenTable
and column_name=#GivenCol) AAA) AA;
SET #x = 0;
SELECT GROUP_CONCAT(dbalias,'.*') INTO #DeleteTableList
FROM (SELECT CONCAT(db,'.',tb) dbtb,CONCAT('dbalias',num) dbalias
FROM (SELECT table_schema db,table_name tb,(#x:=#X+1) num,column_name col
FROM information_schema.columns WHERE table_name=#GivenTable
and column_name=#GivenCol) AAA) AA;
SET #x = 0;
SELECT GROUP_CONCAT(dbtb,' AS ',dbalias) INTO #FromList
FROM (SELECT CONCAT(db,'.',tb) dbtb,CONCAT('dbalias',num) dbalias
FROM (SELECT table_schema db,table_name tb,(#x:=#X+1) num,column_name col
FROM information_schema.columns WHERE table_name=#GivenTable
and column_name=#GivenCol) AAA) AA;
SET #x = 0;
SELECT GROUP_CONCAT(CONCAT(dbalias,'.',col,'=',
QUOTE(#GivenValue)) SEPARATOR ' AND ') INTO #WhereClause
FROM (SELECT CONCAT(db,'.',tb) dbtb,CONCAT('dbalias',num) dbalias,col
FROM (SELECT table_schema db,table_name tb,(#x:=#X+1) num,column_name col
FROM information_schema.columns WHERE table_name=#GivenTable
and column_name=#GivenCol) AAA) AA;
SET #OptTableSQL = CONCAT('OPTIMIZE TABLE ',#OptimizeTableList);
SET #DeleteSQL = CONCAT('DELETE ',#DeleteTableList,' FROM ',#FromList,' WHERE ',#WhereClause);
PREPARE st FROM #DeleteSQL; EXECUTE st; DEALLOCATE PREPARE st;
PREPARE st FROM #OptTableSQL; EXECUTE st; DEALLOCATE PREPARE st;
SELECT * FROM db1.mytb;
SELECT * FROM db2.mytb;
SELECT * FROM db3.mytb;
SAMPLE DATA
DROP DATABASE IF EXISTS db1;
DROP DATABASE IF EXISTS db2;
DROP DATABASE IF EXISTS db3;
CREATE DATABASE db1;
CREATE DATABASE db2;
CREATE DATABASE db3;
CREATE TABLE db1.mytb
(id int not null auto_increment,
dat varchar(20),
primary key (id),key (dat));
INSERT INTO db1.mytb (dat) VALUES
('McDonald''s'),('Wendy''s'),
('Burger King'),('Jack in the Box');
CREATE TABLE db2.mytb LIKE db1.mytb;
CREATE TABLE db3.mytb LIKE db1.mytb;
INSERT INTO db2.mytb (dat) SELECT dat FROM db1.mytb;
INSERT INTO db3.mytb (dat) SELECT dat FROM db1.mytb;
SELECT * FROM db1.mytb;
SELECT * FROM db2.mytb;
SELECT * FROM db3.mytb;
SAMPLE DATA LOADED
mysql> DROP DATABASE IF EXISTS db1;
Query OK, 1 row affected (0.00 sec)
mysql> DROP DATABASE IF EXISTS db2;
Query OK, 1 row affected (0.00 sec)
mysql> DROP DATABASE IF EXISTS db3;
Query OK, 1 row affected (0.00 sec)
mysql> CREATE DATABASE db1;
Query OK, 1 row affected (0.00 sec)
mysql> CREATE DATABASE db2;
Query OK, 1 row affected (0.00 sec)
mysql> CREATE DATABASE db3;
Query OK, 1 row affected (0.00 sec)
mysql> CREATE TABLE db1.mytb
-> (id int not null auto_increment,
-> dat varchar(20),
-> primary key (id),key (dat));
Query OK, 0 rows affected (0.08 sec)
mysql> INSERT INTO db1.mytb (dat) VALUES
-> ('McDonald''s'),('Wendy''s'),
-> ('Burger King'),('Jack in the Box');
Query OK, 4 rows affected (0.00 sec)
Records: 4 Duplicates: 0 Warnings: 0
mysql> CREATE TABLE db2.mytb LIKE db1.mytb;
Query OK, 0 rows affected (0.06 sec)
mysql> CREATE TABLE db3.mytb LIKE db1.mytb;
Query OK, 0 rows affected (0.03 sec)
mysql> INSERT INTO db2.mytb (dat) SELECT dat FROM db1.mytb;
Query OK, 4 rows affected (0.00 sec)
Records: 4 Duplicates: 0 Warnings: 0
mysql> INSERT INTO db3.mytb (dat) SELECT dat FROM db1.mytb;
Query OK, 4 rows affected (0.00 sec)
Records: 4 Duplicates: 0 Warnings: 0
mysql> SELECT * FROM db1.mytb;
+----+-----------------+
| id | dat |
+----+-----------------+
| 1 | McDonald's |
| 2 | Wendy's |
| 3 | Burger King |
| 4 | Jack in the Box |
+----+-----------------+
4 rows in set (0.00 sec)
mysql> SELECT * FROM db2.mytb;
+----+-----------------+
| id | dat |
+----+-----------------+
| 1 | Burger King |
| 2 | Jack in the Box |
| 3 | McDonald's |
| 4 | Wendy's |
+----+-----------------+
4 rows in set (0.00 sec)
mysql> SELECT * FROM db3.mytb;
+----+-----------------+
| id | dat |
+----+-----------------+
| 1 | Burger King |
| 2 | Jack in the Box |
| 3 | McDonald's |
| 4 | Wendy's |
+----+-----------------+
4 rows in set (0.00 sec)
mysql>
SOLUTION EXECUTED
mysql> USE db1
Database changed
mysql> SET #GivenTable = 'mytb';
Query OK, 0 rows affected (0.00 sec)
mysql> SET #GivenCol = 'dat';
Query OK, 0 rows affected (0.00 sec)
mysql> SET #GivenValue = 'Burger King';
Query OK, 0 rows affected (0.00 sec)
mysql> SET #x = 0;
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT GROUP_CONCAT(dbtb) INTO #OptimizeTableList
-> FROM (SELECT CONCAT(db,'.',tb) dbtb,CONCAT('dbalias',num) dbalias
-> FROM (SELECT table_schema db,table_name tb,(#x:=#X+1) num,column_name col
-> FROM information_schema.columns WHERE table_name=#GivenTable
-> and column_name=#GivenCol) AAA) AA;
Query OK, 1 row affected (0.02 sec)
mysql> SET #x = 0;
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT GROUP_CONCAT(dbalias,'.*') INTO #DeleteTableList
-> FROM (SELECT CONCAT(db,'.',tb) dbtb,CONCAT('dbalias',num) dbalias
-> FROM (SELECT table_schema db,table_name tb,(#x:=#X+1) num,column_name col
-> FROM information_schema.columns WHERE table_name=#GivenTable
-> and column_name=#GivenCol) AAA) AA;
Query OK, 1 row affected (0.02 sec)
mysql> SET #x = 0;
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT GROUP_CONCAT(dbtb,' AS ',dbalias) INTO #FromList
-> FROM (SELECT CONCAT(db,'.',tb) dbtb,CONCAT('dbalias',num) dbalias
-> FROM (SELECT table_schema db,table_name tb,(#x:=#X+1) num,column_name col
-> FROM information_schema.columns WHERE table_name=#GivenTable
-> and column_name=#GivenCol) AAA) AA;
Query OK, 1 row affected (0.02 sec)
mysql> SET #x = 0;
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT GROUP_CONCAT(CONCAT(dbalias,'.',col,'=',
-> QUOTE(#GivenValue)) SEPARATOR ' AND ') INTO #WhereClause
-> FROM (SELECT CONCAT(db,'.',tb) dbtb,CONCAT('dbalias',num) dbalias,col
-> FROM (SELECT table_schema db,table_name tb,(#x:=#X+1) num,column_name col
-> FROM information_schema.columns WHERE table_name=#GivenTable
-> and column_name=#GivenCol) AAA) AA;
Query OK, 1 row affected (0.03 sec)
mysql> SET #OptTableSQL = CONCAT('OPTIMIZE TABLE ',#OptimizeTableList);
Query OK, 0 rows affected (0.00 sec)
mysql> SET #DeleteSQL = CONCAT('DELETE ',#DeleteTableList,' FROM ',#FromList,' WHERE ',#WhereClause);
Query OK, 0 rows affected (0.00 sec)
mysql> PREPARE st FROM #DeleteSQL; EXECUTE st; DEALLOCATE PREPARE st;
Query OK, 0 rows affected (0.00 sec)
Statement prepared
Query OK, 3 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
mysql> PREPARE st FROM #OptTableSQL; EXECUTE st; DEALLOCATE PREPARE st;
Query OK, 0 rows affected (0.00 sec)
Statement prepared
+----------+----------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+----------+----------+----------+----------+
| db1.mytb | optimize | status | OK |
| db2.mytb | optimize | status | OK |
| db3.mytb | optimize | status | OK |
+----------+----------+----------+----------+
3 rows in set (0.05 sec)
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT * FROM db1.mytb;
+----+-----------------+
| id | dat |
+----+-----------------+
| 1 | McDonald's |
| 2 | Wendy's |
| 4 | Jack in the Box |
+----+-----------------+
3 rows in set (0.00 sec)
mysql> SELECT * FROM db2.mytb;
+----+-----------------+
| id | dat |
+----+-----------------+
| 2 | Jack in the Box |
| 3 | McDonald's |
| 4 | Wendy's |
+----+-----------------+
3 rows in set (0.01 sec)
mysql> SELECT * FROM db3.mytb;
+----+-----------------+
| id | dat |
+----+-----------------+
| 2 | Jack in the Box |
| 3 | McDonald's |
| 4 | Wendy's |
+----+-----------------+
3 rows in set (0.01 sec)
mysql>
WHAT DO THE QUERIES LOOK LIKE
mysql> SELECT #OptimizeTableList,#DeleteTableList,#FromList,
-> #WhereClause,#OptTableSQL,#DeleteSQL\G
*************************** 1. row ***************************
#OptimizeTableList: db1.mytb,db2.mytb,db3.mytb
#DeleteTableList: dbalias1.*,dbalias2.*,dbalias3.*
#FromList: db1.mytb AS dbalias1,db2.mytb AS dbalias2,db3.mytb AS dbalias3
#WhereClause: dbalias1.dat='Burger King' AND dbalias2.dat='Burger King' AND dbalias3.dat='Burger King'
#OptTableSQL: OPTIMIZE TABLE db1.mytb,db2.mytb,db3.mytb
#DeleteSQL: DELETE dbalias1.*,dbalias2.*,dbalias3.* FROM db1.mytb AS dbalias1,db2.mytb AS dbalias2,db3.mytb AS dbalias3 WHERE dbalias1.dat='Burger King' AND dbalias2.dat='Burger King' AND dbalias3.dat='Burger King'
1 row in set (0.00 sec)
mysql>
CAVEAT
You have to be standing in one of the three databases for it to work
Are you surprised it worked ??? Hey, so am I !!!
For more information on multiple-table DELETE, see the MySQL Documentation. Search for the phrase multiple-table DELETE statement.

Related

how to update records of two different table present in two different database through single procedure in mysql?

CREATE PROCEDURE p_samp(
IN p_id INT,IN p_table_choice VARCHAR(10)
)
BEGIN
CASE p_table_choice
WHEN p_table_choice = 'A' THEN
USE database1;
update sample1
SET name = 'sam'
WHERE id = p_id;
WHEN p_table_choice = 'B' THEN
USE database2;
update sample2
SET name = 'sam'
WHERE id = p_id;
ELSE
BEGIN
END;
END CASE ;
END;
You can try:
CREATE PROCEDURE p_samp(
IN p_id INT,IN p_table_choice VARCHAR(10)
)
BEGIN
CASE p_table_choice
WHEN p_table_choice = 'A' THEN
update database1.sample1
SET name = 'sam'
WHERE id = p_id;
WHEN p_table_choice = 'B' THEN
update database2.sample2
SET name = 'sam'
WHERE id = p_id;
ELSE
BEGIN
END;
END CASE ;
END;
I tried a sample procedure and it worked.
Here's a sample procedure I tried to perform a similar update between two databases learning and pricing >>
CREATE PROCEDURE `xxxx`(A int(1))
begin
case A
when 1 then update learning.GAUL set user='OBELIX' where id=1;
when 0 then update pricing.K1 set amntIN='500' where account=1;
else
select 'DUMMY';
END CASE;
END
So basically the first update shall result in one affected row and the 2nd one shall result in 2 affected rows.
I call them:
mysql> call xxxx(1);
Query OK, 1 row affected (0.05 sec)
mysql> call xxxx(0);
Query OK, 3 rows affected (0.12 sec)
mysql> call xxxx(3);
+-------+
| DUMMY |
+-------+
| DUMMY |
+-------+
1 row in set (0.00 sec)
The following script works as expect:
mysql> DROP PROCEDURE IF EXISTS `p_samp`;
Query OK, 0 rows affected (0.00 sec)
mysql> DROP TABLE IF EXISTS `database2`.`sample2`,
-> `database1`.`sample1`;
Query OK, 0 rows affected (0.00 sec)
mysql> DROP DATABASE IF EXISTS `database2`;
Query OK, 0 rows affected (0.00 sec)
mysql> DROP DATABASE IF EXISTS `database1`;
Query OK, 0 rows affected (0.00 sec)
mysql> CREATE DATABASE IF NOT EXISTS `database1`;
Query OK, 1 row affected (0.00 sec)
mysql> CREATE DATABASE IF NOT EXISTS `database2`;
Query OK, 1 row affected (0.00 sec)
mysql> CREATE TABLE IF NOT EXISTS `database1`.`sample1` (
-> `id` SERIAL,
-> `name` VARCHAR(255)
-> );
Query OK, 0 rows affected (0.00 sec)
mysql> CREATE TABLE IF NOT EXISTS `database2`.`sample2` (
-> `id` SERIAL,
-> `name` VARCHAR(255)
-> );
Query OK, 0 rows affected (0.00 sec)
mysql> INSERT INTO `database1`.`sample1`
-> (`name`)
-> VALUES
-> ('sam in db1');
Query OK, 1 row affected (0.00 sec)
mysql> INSERT INTO `database2`.`sample2`
-> (`name`)
-> VALUES
-> ('sam in db2');
Query OK, 1 row affected (0.00 sec)
mysql> DELIMITER //
mysql> CREATE PROCEDURE `p_samp` (
-> `p_id` BIGINT UNSIGNED,
-> `p_table_choice` CHAR(1)
-> )
-> BEGIN
-> CASE `p_table_choice`
-> WHEN 'A' THEN
-> UPDATE `database1`.`sample1`
-> SET `name` = 'sam'
-> WHERE `id` = `p_id`;
-> WHEN 'B' THEN
-> UPDATE `database2`.`sample2`
-> SET `name` = 'sam'
-> WHERE `id` = `p_id`;
-> END CASE;
-> END//
Query OK, 0 rows affected (0.00 sec)
mysql> DELIMITER ;
mysql> SELECT
-> `id`,
-> `name`
-> FROM
-> `database1`.`sample1`;
+----+------------+
| id | name |
+----+------------+
| 1 | sam in db1 |
+----+------------+
1 row in set (0.00 sec)
mysql> SELECT
-> `id`,
-> `name`
-> FROM
-> `database2`.`sample2`;
+----+------------+
| id | name |
+----+------------+
| 1 | sam in db2 |
+----+------------+
1 row in set (0.00 sec)
mysql> CALL `p_samp`(1, 'A');
Query OK, 1 row affected (0.00 sec)
mysql> SELECT
-> `id`,
-> `name`
-> FROM
-> `database1`.`sample1`;
+----+------+
| id | name |
+----+------+
| 1 | sam |
+----+------+
1 row in set (0.00 sec)
mysql> SELECT
-> `id`,
-> `name`
-> FROM
-> `database2`.`sample2`;
+----+------------+
| id | name |
+----+------------+
| 1 | sam in db2 |
+----+------------+
1 row in set (0.00 sec)
mysql> CALL `p_samp`(1, 'B');
Query OK, 1 row affected (0.00 sec)
mysql> SELECT
-> `id`,
-> `name`
-> FROM
-> `database1`.`sample1`;
+----+------+
| id | name |
+----+------+
| 1 | sam |
+----+------+
1 row in set (0.00 sec)
mysql> SELECT
-> `id`,
-> `name`
-> FROM
-> `database2`.`sample2`;
+----+------+
| id | name |
+----+------+
| 1 | sam |
+----+------+
1 row in set (0.00 sec)

INSERT INTO with empty results from SELECT

I'm trying to insert into table A from the results gather from table B:
INSERT INTO A (x, y, created_at)
(SELECT x, "something", a_timestamp
FROM B WHERE c IS NULL AND a_timestamp > NOW())
The issue is that, for some instances
(SELECT x, "something", a_timestamp
FROM B WHERE c IS NULL AND a_timestamp > NOW())
doesn't return any records (which is okay), but then the other INSERT fails.
How can I cover myself from that scenario?
Thanks!
I can't reproduce the error:
mysql> DROP TABLE IF EXISTS `tbl_test`;
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> CREATE TABLE IF NOT EXISTS `tbl_test` (
-> `id` TINYINT
-> );
Query OK, 0 rows affected (0.00 sec)
mysql> INSERT INTO `tbl_test`
-> SELECT 1
-> FROM DUAL
-> WHERE 0 = 0;
Query OK, 1 row affected (0.00 sec)
Records: 1 Duplicates: 0 Warnings: 0
mysql> SELECT `id` FROM `tbl_test`;
+------+
| id |
+------+
| 1 |
+------+
1 row in set (0.00 sec)
mysql> INSERT INTO `tbl_test`
-> SELECT 1
-> FROM DUAL
-> WHERE 0 = 1;
Query OK, 0 rows affected (0.00 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> SELECT `id` FROM `tbl_test`;
+------+
| id |
+------+
| 1 |
+------+
1 row in set (0.00 sec)
UPDATE
mysql> DROP TABLE IF EXISTS `tbl_test`;
Query OK, 0 rows affected (0.00 sec)
mysql> CREATE TABLE IF NOT EXISTS `tbl_test` (
-> `id` TINYINT
-> );
Query OK, 0 rows affected (0.00 sec)
mysql> INSERT INTO `tbl_test`
-> (`id`)
-> VALUES
-> (101);
Query OK, 1 row affected (0.00 sec)
mysql> SELECT `id`
-> FROM `tbl_test`;
+------+
| id |
+------+
| 101 |
+------+
1 row in set (0.00 sec)
mysql> INSERT INTO `tbl_test`
-> SELECT `id` + 1
-> FROM `tbl_test`
-> WHERE `id` > 100;
Query OK, 1 row affected (0.00 sec)
Records: 1 Duplicates: 0 Warnings: 0
mysql> SELECT `id`
-> FROM `tbl_test`;
+------+
| id |
+------+
| 101 |
| 102 |
+------+
2 rows in set (0.00 sec)
mysql> INSERT INTO `tbl_test`
-> SELECT `id` + 1
-> FROM `tbl_test`
-> WHERE `id` < 100;
Query OK, 0 rows affected (0.00 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> SELECT `id`
-> FROM `tbl_test`;
+------+
| id |
+------+
| 101 |
| 102 |
+------+
2 rows in set (0.00 sec)
See db-fiddle.
You can use INSERT IGNORE INTO to address your issue.
For example:
INSERT IGNORE INTO A (x, y, created_at)
(SELECT x, "something", a_timestamp
FROM B WHERE c IS NULL AND a_timestamp > NOW())
More info can be found here
"INSERT INTO A (x, y, created_at)
(SELECT x, \"something\", a_timestamp
FROM B WHERE c IS NULL AND a_timestamp > \"#{current_time}\")
To
"INSERT INTO A (x, y, created_at)
(SELECT x, \"something\", a_timestamp
FROM B WHERE c IS NULL AND a_timestamp > \"#{current_time}\")
AND (SELECT count(x) FROM B WHERE c IS NULL AND a_timestamp > \"#{current_time}\")) > 0"

MySQL database() vs database name

I constructed a query where i use:
where table_schema=database()
but if i replace database() with the database-name i get an empty resultset.
Why is that?
Thank you in advance!
EDIT:
The whole query:
SELECT table_name from information_schema.tables where
table_schema=database()
the databasename is
training
I can't reproduce the problem.
mysql> CREATE DATABASE `training`;
Query OK, 1 row affected (0.00 sec)
mysql> USE `training`;
Database changed
mysql> CREATE TABLE `test_table`(`c0` INTEGER);
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT
-> `table_name`
-> FROM
-> `information_schema`.`TABLES`
-> WHERE
-> `table_schema` = DATABASE();
+------------+
| table_name |
+------------+
| test_table |
+------------+
1 row in set (0.00 sec)
mysql> SELECT
-> `table_name`
-> FROM
-> `information_schema`.`TABLES`
-> WHERE
-> `table_schema` = 'training';
+------------+
| table_name |
+------------+
| test_table |
+------------+
1 row in set (0.00 sec)

Prepared Statements Mysql

I have a prepared statement I want to execute direct to the MySQL server;
USE `testdb`;
SET #t = (
SELECT GROUP_CONCAT(mytab.TABLE_NAME SEPARATOR ', ')
FROM (SELECT * FROM information_schema.TABLES as `m` WHERE table_schema = 'testdb' AND table_name LIKE 'mi_%' LIMIT 0,1) as `mytab`
);
PREPARE `stmt1` FROM 'DROP TABLE t';
EXECUTE `stmt1` USING #t;
DEALLOCATE PREPARE `stmt1`;
However, when I execute it returns an error on the EXECUTE line saying
Error Code: 1210. Incorrect arguments to EXECUTE
I would appreciate any help on what I'm doing wrong.
I have mysql version 5.1.68
Your issue can be resolved with preparing fully static DDL before executing. Sample:
Tables:
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| a |
| b |
+----------------+
2 rows in set (0.00 sec)
And your (little modified) SQL:
mysql> SET #t = (SELECT GROUP_CONCAT(mytab.TABLE_NAME SEPARATOR ', ') FROM (SELECT * FROM information_schema.TABLES as `m` WHERE table_schema = 'test'
AND table_name LIKE 'a%' LIMIT 0,1) as `mytab`);
Query OK, 0 rows affected (0.06 sec)
mysql> select #t;
+------+
| #t |
+------+
| a |
+------+
1 row in set (0.00 sec)
Now, DDL:
mysql> set #drop = CONCAT('DROP TABLE ', #t);
Query OK, 0 rows affected (0.00 sec)
mysql> select #drop;
+--------------+
| #drop |
+--------------+
| DROP TABLE a |
+--------------+
1 row in set (0.00 sec)
And, finally, prepared statement:
mysql> PREPARE `stmt1` FROM #drop;
Query OK, 0 rows affected (0.00 sec)
Statement prepared
mysql> EXECUTE `stmt1`;
Query OK, 0 rows affected (0.00 sec)
You'll get:
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| b |
+----------------+
1 row in set (0.00 sec)
You can use only one variable (I've added #drop to increase readability)

mysql delete triggers

I think I read that the delete trigger doesn't know what data was deleted and loops over the whole table applying the trigger. Is that true?
Does that mean that the before delete loops over the whole table before the data is deleted and after delete loops over the whole table after the delete occurs?
Is there no way to loop over just the deleted records? So If 10 records are deleted loop over them?
DELIMITER $$
DROP TRIGGER `before_delete_jecki_triggername`$$
CREATE TRIGGER before_delete_triggername
BEFORE DELETE ON table
FOR EACH ROW
BEGIN
/*do stuff*/
END$$
DELIMITER ;
Thanks,
Mat
I think it was due to a confusion with FOR EACH ROW statement.
It is only for "matched records for the statement issued before trigger is invoked."
If there exists N number of records in a table and matches records for where id=x,
assuming x causes a result of less than N records, say N-5, then
FOR EACH ROW causes a loop for N-5 times only.
UPDATE:
A sample test run on the rows affected due to FOR EACH ROW statement is shown below.
mysql> -- create a test table
mysql> drop table if exists tbl; create table tbl ( i int, v varchar(10) );
Query OK, 0 rows affected (0.01 sec)
Query OK, 0 rows affected (0.06 sec)
mysql> -- set test data
mysql> insert into tbl values(1,'one'),(2,'two' ),(3,'three'),(10,'ten'),(11,'eleven');
Query OK, 5 rows affected (0.02 sec)
Records: 5 Duplicates: 0 Warnings: 0
mysql> select * from tbl;
+------+--------+
| i | v |
+------+--------+
| 1 | one |
| 2 | two |
| 3 | three |
| 10 | ten |
| 11 | eleven |
+------+--------+
5 rows in set (0.02 sec)
mysql> select count(*) row_count from tbl;
+-----------+
| row_count |
+-----------+
| 5 |
+-----------+
1 row in set (0.00 sec)
mysql>
mysql> -- record loop count of trigger in a table
mysql> drop table if exists rows_affected; create table rows_affected( i int );
Query OK, 0 rows affected (0.02 sec)
Query OK, 0 rows affected (0.05 sec)
mysql> select count(*) 'rows_affected' from rows_affected;
+---------------+
| rows_affected |
+---------------+
| 0 |
+---------------+
1 row in set (0.00 sec)
mysql>
mysql> set #cnt=0;
Query OK, 0 rows affected (0.00 sec)
mysql>
mysql> -- drop trigger if exists trig_bef_del_on_tbl;
mysql> delimiter //
mysql> create trigger trig_bef_del_on_tbl before delete on tbl
-> for each row begin
-> set #cnt = if(#cnt is null, 1, (#cnt+1));
->
-> /* for cross checking save loop count */
-> insert into rows_affected values ( #cnt );
-> end;
-> //
Query OK, 0 rows affected (0.00 sec)
mysql>
mysql> delimiter ;
mysql>
mysql> -- now let us test the delete operation
mysql> delete from tbl where i like '%1%';
Query OK, 3 rows affected (0.02 sec)
mysql>
mysql> -- now let us see what the loop count was
mysql> select #cnt as 'cnt';
+------+
| cnt |
+------+
| 3 |
+------+
1 row in set (0.00 sec)
mysql>
mysql> -- now let us see the table data
mysql> select * from tbl;
+------+-------+
| i | v |
+------+-------+
| 2 | two |
| 3 | three |
+------+-------+
2 rows in set (0.00 sec)
mysql> select count(*) row_count from tbl;
+-----------+
| row_count |
+-----------+
| 2 |
+-----------+
1 row in set (0.00 sec)
mysql> select count(*) 'rows_affected' from rows_affected;
+---------------+
| rows_affected |
+---------------+
| 3 |
+---------------+
1 row in set (0.00 sec)
mysql>