Archive

Posts Tagged ‘mysql’

MySQL grant and revoke

May 19th, 2010 1 comment

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

March 31st, 2010 No comments

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

March 23rd, 2010 No comments

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

February 8th, 2010 No comments

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;

Using mysqlimport

January 21st, 2010 No comments

Text file (/var/text-data/film.txt)
1,Dead Note – part 1,mms://113.113.113.113/huypv/share/film/akzvx.avi
12,Dead Note – part 2,mms://113.113.113.113/huypv/share/film/akzvy.avi

Table film in database share
CREATE TABLE film (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(113), url VARCHAR(113));

mysqlimport –fields-terminated-by=, –lines-terminated-by=”\n” -uroot -pXXX share /var/text-data/film.txt

Notice: Nếu client và server không thuộc cùng một máy thì lệnh như trên sẽ không chạy nữa do mặc định nó sẽ tìm file trên máy server. Lúc này cần thêm tham số để nó tìm file nguồn import ở máy client (local)
mysqlimport –local –fields-terminated-by=, –lines-terminated-by=”\n” -uroot -pXXX share /var/text-data/film.txt

Bonus: Exec SQL query by command
mysql -uroot -pXXX share -e “TRUNCATE TABLE film”