Tag Archives: mysql

update set values multiple records single query

# insert multiple records
INSERT INTO my_table (column_1, column_2, …) VALUES (value_1, value_2), (value_11, value_12), …

# update???
UPDATE news
SET title = CASE id
WHEN 13 THEN ‘New title for #1’
WHEN 74 THEN ‘New title for #74’
END, content = CASE id
WHEN 13 THEN ‘New content for #13’
WHEN 74 THEN ‘New content for #74’
END, updated=NOW()
WHERE id IN (13, 74);

MySQL grant and revoke

mysql -uroot -pRooTIsmE -h mysqlServer

create user special@’%’ identified by ‘password’;
grant all on *.* to special@’%’ identified by ‘password’;
revoke drop, delete on *.* from special@’%’ identified by ‘password’;
flush privileges;
show grants for special@’%’;
exit;

mysql -uspecial -ppassword
create database huypv;
drop database huypv;
#ERROR 1044 (42000): Access denied for user ‘special’@’%’ to database ‘huypv’

Procedure with cursor in MySQL

Trước học MSSQL 2000 cũng procedure ầm ầm rồi. Thường thôi!

#PROCEDURE – CURSOR
CREATE DATABASE IF NOT EXISTS test;

USE test;

CREATE TABLE IF NOT EXISTS book(id INT AUTO_INCREMENT, title VARCHAR(255), PRIMARY KEY (id));
INSERT INTO book SET title='World in the war1';
INSERT INTO book SET title='World in the war2';

DELIMITER $$
DROP PROCEDURE IF EXISTS CursorProc$$
CREATE PROCEDURE CursorProc()
BEGIN

DECLARE d INT DEFAULT 0;
DECLARE _id INT;
DECLARE _title VARCHAR(255);
declare _count int default 0;

DECLARE cur CURSOR FOR
    SELECT id, title FROM book;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET d = 1;

OPEN cur;
lbl: LOOP
    FETCH cur INTO _id, _title;
    IF d=1 THEN
        LEAVE lbl;
    END IF;

    IF NOT d = 1 THEN
        SET _count = _count + 1;
    END IF;
END LOOP lbl;
CLOSE cur;

SELECT _count as `Tong so ban ghi`;

END$$
DELIMITER ;
CALL CursorProc;

Partition-MySQL-Version-5.1.txt

CHÚ Ý: Khi ALTER TABLE DROP PARTITION => sẽ mất dữ liệu!!!

Tạo dữ liệu ảo:
delimiter //
CREATE PROCEDURE load_part_tab()
begin
declare v int default 0;
         while v < 8000000
do
insert into transaction (created_time, price, action, object, object_id, cp_id)
values (adddate('2009-01-01',(rand(v)*36520) mod 3652), 1000, 'download', 'video', 113, 2);
set v = v + 1;
end while;
end
//

delimiter ;
call load_part_tab();

ALTER TABLE transaction
    PARTITION BY RANGE (TO_DAYS(created_time))
    (PARTITION p1 VALUES LESS THAN (TO_DAYS('2010-01-01')),
     PARTITION p2 VALUES LESS THAN (TO_DAYS('2010-04-01')),
     PARTITION p3 VALUES LESS THAN (TO_DAYS('2010-07-01')),
     PARTITION p4 VALUES LESS THAN (TO_DAYS('2010-11-01')),
     PARTITION p5 VALUES LESS THAN (TO_DAYS('2011-01-01')),
     PARTITION p6 VALUES LESS THAN (TO_DAYS('2011-04-01')),
     PARTITION p7 VALUES LESS THAN (TO_DAYS('2011-07-01')),
     PARTITION p8 VALUES LESS THAN (TO_DAYS('2011-11-01'))
    );

# Thêm một PARTITION
ALTER TABLE transaction ADD PARTITION (PARTITION p9 VALUES LESS THAN MAXVALUE);

# Tách một partition
ALTER TABLE TRANSACTION reorganize partition p9 into
(PARTITION p9 VALUES LESS THAN (TO_DAYS('2012-01-01')),
PARTITION p10 VALUES LESS THAN MAXVALUE);

#ERROR 1503 (HY000): A PRIMARY KEY must include all columns in the table's partitioning function

ALTER TABLE `transaction` DROP COLUMN `id`, DROP PRIMARY KEY;

# Ko dùng hàm (chả hạn: date(created_time) vs ) vì như thế sẽ ko sử dụng được benefit của partition
EXPLAIN PARTITIONS SELECT DATE(created_time), SUM(price) FROM transaction
WHERE created_time BETWEEN '2010-03-23 00:00:00' AND '2010-04-02 23:59:59'
GROUP BY DATE(created_time)
\G

http://dev.mysql.com/tech-resources/articles/mysql_5.1_partitioning.html
#Xóa dữ liệu "cũ"
DELETE FROM transaction
WHERE created_time > date '1995-01-01' and created_time < date '2010-01-01';

#Xóa partition p1 tương ứng
ALTER TABLE transaction DROP PARTITION p1;

Lấy bản ghi ngẫu nhiên từ database

Làm thế nào để lấy ra một số bản ghi ngẫu nhiên từ database?
Nếu tư duy một cách đơn giản thì đầu tiên bạn sẽ phải generate các mã ID ngẫu nhiên rồi từ các mã ID đó query lấy ra bản ghi tương ứng.
Tuy nhiên mã ID generate ra phải làm sao đảm bảo là có tương ứng một bản ghi với nó :-? Điều này có vẻ khó. Thôi vứt đê, đừng bận tâm, bởi MySQL đã hỗ trợ sẵn việc lấy ra các bản ghi ngẫu nhiên rồi :-j

Ví dụ nè:
– Lấy ra ngẫu nhiên 10 người may mắn để trao giải thưởng may mắn sau khi tàn cuộc vui
SELECT * FROM people ORDER BY RAND() limit 10;
– Lấy ra 5 người phụ nữ ngẫu nhiên may mắn để tôn vinh
SELECT * FROM people WHERE sex=’female’ ORDER BY RAND() LIMIT 5;