2013-02-12 38 views
6

Tôi có một bảng được gọi là> Dự án có trường tăng tự động cho số giá thầu ước tính dự án được gọi là Project_ID.Tự động Gia tăng bao gồm Năm và Tháng trong MySql

Trường này được tự động tăng lên. Tôi đã tạo nó như một trường ký tự 8 chữ số mang quy tắc trường.

Tôi cần nó để tăng tự động dưới dạng hai năm, hai tháng số, bao gồm dấu nối và sau đó là số bắt đầu tại cho bản ghi đầu tiên trong khoảng thời gian đó.

Một ví dụ cho tháng Tư năm 2012 sẽ được 1204-001 cho các hồ sơ đầu tiên , 1204-002 cho 2 và vv sau đó khi tháng Năm cuộn quanh PROJECT_ID sẽ thay đổi để 1205- 001.

Những gì tôi đã cố gắng để viết được như sau, tôi giữ nó như là một biểu hiện mặc định đơn giản với một giá trị mặc định của

Cyear(date()) + (month()) + “-“ + “001” . 

Làm thế nào tôi đã đạt được điều này?

+4

Quy trình được lưu trữ hoặc thực hiện chèn bằng ngôn ngữ lồng ghép như Perl, Java hoặc C#. Ở mức tối thiểu, bạn sẽ cần phải 1) chọn tối đa (Project_id), 2) xác định nếu nó giống nhau hoặc một tháng/năm khác nhau, 3) nhận mã năm và tháng, 4) tính chỉ mục (-001, - 002, vv) và 5) chèn giá trị Project_id kết quả (cùng với phần còn lại của các trường đi kèm với bản ghi này). IMHO ... – paulsm4

+0

Có không có cơ chế trong xây dựng trong MySql để cho phép điều này. Theo dõi @ paulsm4 – Minesh

+0

Chức năng được lưu trữ để có được 'Project_ID' tiếp theo. – SparKot

Trả lời

1

Về cơ bản, bạn có thể sử dụng TRƯỚC KHI CHERTNTRIGGER trên bảng bạn muốn cột được tăng lên.

Dưới đây là một số bước để tạo ra một thuật toán đơn giản và đặt mã này bên trong trigger:

// get current YEAR 
SET @cur_Year = CONCAT(DATE_FORMAT(CURDATE(), '%Y')); 
// get current MONTH 
SET @cur_MONTH = CONCAT(DATE_FORMAT(CURDATE(), '%m')); 
// concatenate YEAR and MONTH 
SET @Year_Month = CONCAT(@cur_Year, @cur_MONTH); 
// get the last value for the current YEAR and MONTH 
SET @max_ID = (SELECT MAX(ID) 
       FROM tableName 
       WHERE ID LIKE CONCAT(@Year_Month, '-%')); 
// get the last three characters from the id, convert in to 
// integer and increment by 1 
SET @last_ID = CAST(RIGHT(@max_ID, 3) AS SIGNED) + 1; 
// pad zero on the left using LPAD and 
// concatenate it with YEAR and MONTH 
SET @new_ID = CONCAT(@Year_Month,'-',LPAD(CAST(@last_ID AS CHAR(3)), 3, '0')); 
0
INSERT INTO (Project_ID, col1, col2, col3) 
SELECT DATE_FORMAT(NOW(), CONCAT('%y%m-', 
    (( SELECT RIGHT(CONCAT('000', (RIGHT(Project_ID, 3) + 1)), 3) AS number 
     FROM table_name 
     WHERE LEFT(Project_ID, 5) = DATE_FORMAT(NOW(), '%y%m-')) 
     ORDER BY Project_ID DESC 
     UNION 
    ( SELECT '001') 
     LIMIT 1))), 
'Col1 data', 'Col2 data', 'Col3 data' 

này có thể nhìn một chút kỳ quặc, vì vậy tôi sẽ chỉ giải thích dòng chảy:

Tôi sử dụng INSERT INTO ... SELECT để tôi có thể kiểm tra dữ liệu hiện có từ table_name để xem liệu có bất kỳ trường hợp hiện có nào chưa. WHERE sẽ tìm thấy các trường hợp hiện tại và nhờ cả hai số RIGHTLEFT, không quá khó để khắc phục dữ liệu có liên quan cần thiết. Nếu không tìm thấy hàng nào, thay vào đó, '001' sẽ được sử dụng, sau đó bạn chỉ cần gán các cột hiện tại như được hiển thị.

1

Tôi đã hoàn toàn giải quyết nó, chỉ cần có một cái nhìn ..

Lúc đầu, bạn phải mất một bảng mẫu nơi các cột sẽ được cùng với các cột của bảng ban đầu của bạn ngoại trừ cột project_id.

sau đó chèn một hàng vào bảng gốc với giá trị của cột project_id = 0 và các cột khác là rỗng, chỉ cần chèn hàng đầu tiên theo cách thủ công như thế này.

Sau đó, tạo trình kích hoạt trên bảng mẫu như sau ...

////////////////////////////////////////////// ////////////////////////////////////////////////// ////////////////////////////////////////////////// ///////////////////

delimiter ;;

tạo kích hoạt t sau khi chèn vào try

cho mỗi hàng

bắt đầu

khai báo v int;

khai báo c int;

đặt v = (chọn tối đa (project_id) từ original);

if (v = 0) sau đó

chèn vào original thiết

project_id = concat ((chọn concat (bên phải (substring_index ((select * from (chọn curdate() từ try giới hạn 1) như a), '-', '1'), 2), phải (substring_index ((chọn * từ (chọn curdate() từ try giới hạn 1) dưới dạng a), '-', '2'), 2)) từ try giới hạn 1), '- 001'),

project = mới. project;

khác

bộ c = (chọn đúng ((chọn max (project_id) từ original) như x, 3) từ original giới hạn 1);

chèn vào original thiết

project_id = concat ((chọn concat (bên phải (substring_index ((select * from (chọn curdate() từ try giới hạn 1) như là một), '-', '1') , 2), phải (substring_index ((chọn * từ (chọn curdate() từ try giới hạn 1) dưới dạng a), '-', '2'), 2)) từ try giới hạn 1), concat ('- 00' , c + 1)),

project = mới. project;

xóa khỏi original giới hạn 1;

kết thúc nếu;

kết thúc ;;

////////////////////////////////////////////// ////////////////////////////////////////////////// ////////////////////////////////////////////////// ///////////////////

Trong cò trên bảng mẫu của tôi là try (project văn bản) và bảng ban đầu là original (project_id văn bản, project văn bản).Sau khi tạo một trình kích hoạt như thế này trên bảng mẫu, bắt đầu chèn các hàng trong bảng mẫu, các hàng sẽ tự động được chèn vào bảng gốc với các giá trị auto_increment trong cột project_id như.405-001,1405-002, 1405-003 .... trong đó 14201405May và phần còn lại là giá trị auto_incremented đang được tăng lên bằng trình kích hoạt.

Chỉ cần làm theo các bước trên, vấn đề của bạn sẽ được giải quyết chắc chắn.

Các vấn đề liên quan