Sample Header Ad - 728x90

MySql split table on insert

1 vote
1 answer
432 views
I am new so please go easy on me :) I have the following table
CREATE TABLE send_sms (
	sql_id BIGINT(20) NOT NULL AUTO_INCREMENT,
	momt ENUM('MO','MT') NULL DEFAULT NULL,
	sender VARCHAR(20) NULL DEFAULT NULL,
	receiver VARCHAR(20) NULL DEFAULT NULL,
	udhdata BLOB NULL,
	msgdata TEXT NULL,
	time BIGINT(20) NULL DEFAULT NULL,
	smsc_id VARCHAR(255) NULL DEFAULT NULL,
	service VARCHAR(255) NULL DEFAULT NULL,
	account VARCHAR(255) NULL DEFAULT NULL,
	id BIGINT(20) NULL DEFAULT NULL,
	sms_type BIGINT(20) NULL DEFAULT NULL,
	mclass BIGINT(20) NULL DEFAULT NULL,
	mwi BIGINT(20) NULL DEFAULT NULL,
	coding BIGINT(20) NULL DEFAULT NULL,
	compress BIGINT(20) NULL DEFAULT NULL,
	validity BIGINT(20) NULL DEFAULT NULL,
	deferred BIGINT(20) NULL DEFAULT NULL,
	dlr_mask BIGINT(20) NULL DEFAULT NULL,
	dlr_url VARCHAR(255) NULL DEFAULT NULL,
	pid BIGINT(20) NULL DEFAULT NULL,
	alt_dcs BIGINT(20) NULL DEFAULT NULL,
	rpi BIGINT(20) NULL DEFAULT NULL,
	charset VARCHAR(255) NULL DEFAULT NULL,
	boxc_id VARCHAR(255) NULL DEFAULT NULL,
	timestamp TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
	binfo VARCHAR(255) NULL DEFAULT NULL,
	meta_data TEXT NULL,
	priority BIGINT(20) NULL DEFAULT NULL,
	foreign_id VARCHAR(255) NULL DEFAULT NULL,
	PRIMARY KEY (sql_id)
)
COLLATE='latin1_swedish_ci'
ENGINE=InnoDB
;
I have two different applications talking to each other via these tables. I would like to count the inserted rows (only 3 in below example, but could be 1000s at a time) and separate then into 3 other existing tables (same format) So for Example:
INSERT INTO send_sms
( momt, sender, receiver, msgdata, sms_type, dlr_mask, dlr_url ) 
VALUES ( 'MT','1234', '447XXXXXXXX', 'Hello world4', 2, 27, 'test1' ),
( 'MT','Sender', '447XXXXXXXY', 'Hello world4', 2, 27, 'test2' ),
( 'MT','Sender', '447XXXXXXXY', 'Hello world4', 2, 27, 'test3' );
send_sms1 (would have test1) send_sms2 (would have test2) send_sms3 (would have test3) Would need to be able to support if its not multiples of 3 example if its 10,000 rows send_sms1, send_sms2 should get 3,333 and send_sms3 should get 3,334 (doesn't matter which order). As this is a live system the table needs to be accessed at the same time (so during the move the table must be writable for other insert commands I have tried things like like
INSERT INTO send_sms2(SELECT * FROM send_sms WHERE sql_id >= (SELECT COUNT(*) FROM send_sms_dump)/2);
- the above was just a test to split data- this worked however there isn't any delete so the data wasn't moved. Just 50K copied from the table to the other table Please point me in the right direction so I can do some more research :) Update thank you Rick James for the solution. I am now trying to create an update trigger
DELIMITER $$

CREATE TRIGGER my_trigger AFTER INSERT ON send_sms_dump
FOR EACH ROW
BEGIN
    -- Statement one
    INSERT INTO send_sms_dump2
    SELECT * FROM send_sms_dump
             WHERE sql_id % 3 = 0;
    -- Statement two
    INSERT INTO send_sms_dump3
    SELECT * FROM send_sms_dump
             WHERE sql_id % 3 = 1;
    -- More UPDATE statements
	INSERT INTO send_sms_dump4
    SELECT * FROM send_sms_dump
             WHERE sql_id % 3 = 2;
    -- More UPDATE statements
	DELETE FROM send_sms_dump;
END$$
I have the above the error is ... /* SQL Error (1442): Can't update table 'send_sms_dump' in stored function/trigger because it is already used by statement which invoked this stored function/trigger. */ ... I am guessing its because of the delete command, i didn't want to drop the table as the third party application will be writing again to that table - let me know if i should post a new question :) thanks guys
Asked by mcgster (11 rep)
May 5, 2019, 05:35 PM
Last activity: Apr 24, 2025, 12:06 AM