2012-02-28 19 views
1

私はテーブルmemberを持っています。私は、自動増分を使用してユーザーIDを作成したい。 私は、以下のものを使用して試してみました:自動インクリメントby information_schema

SET new.user_id = CONCAT(new.name, LPAD((SELECT AUTO_INCREMENT FROM 
information_schema.TABLES WHERE 
TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'member'),3,'0')); 

しかし、私は新しいメンバーを挿入したとき、私はエラーメッセージuser_id cannot be nullを持っていると、データが追加されませんでした。私はユーザーのIDがjos001のように表示されるように主キーとしてします。

どうすればいいですか?

+0

自動インクリメントの主キーがありますか? – vulkanino

+0

申し訳ありませんが、悪い英語。私はAIプライマリキーがありません –

+0

私はあなたが何をしようとしているのか理解できません。オートインクリメント主キーを持つテーブルを作成すると、完了です。 – vulkanino

答えて

0

は、INSERTトリガする前にこれを試してみてください -

全スクリプト:

CREATE TABLE member(
    user_id VARCHAR(23) NOT NULL, 
    name VARCHAR(20) DEFAULT NULL 
); 

DELIMITER $$ 

CREATE TRIGGER trigger1 
    BEFORE INSERT 
    ON member 
    FOR EACH ROW 
BEGIN 

    -- Find next id for new user - MAX+1 
    SELECT MAX(CAST(SUBSTRING(user_id, LENGTH(user_id) - 2, 3) AS SIGNED)) + 1 INTO @next_id 
    FROM member WHERE SUBSTRING(user_id, 1, LENGTH(user_id) - 3) = NEW.name; 

    SET NEW.user_id = CONCAT(NEW.name, LPAD(IFNULL(@next_id, 1), 3,'0')); 
END$$ 

DELIMITER ; 

をいくつかのレコードを挿入します。

INSERT INTO member VALUES('', 'jos'); 
INSERT INTO member VALUES('', 'jos'); 
INSERT INTO member VALUES('', 'jos'); 
INSERT INTO member VALUES('', 'alex'); 
INSERT INTO member VALUES('', 'alex'); 
INSERT INTO member VALUES('', 'jos'); 

チェック結果:

SELECT * FROM member; 

+---------+------+ 
| user_id | name | 
+---------+------+ 
| jos001 | jos | 
| jos002 | jos | 
| jos003 | jos | 
| alex001 | alex | 
| alex002 | alex | 
| jos004 | jos | 
+---------+------+ 
+0

完全な例を見てください。私はそれを追加しました。 – Devart

+0

ありがとうございます!もう一度やり直してください。 :D –

0

あなたが提供したクエリにUPDATE/TRIGGERが表示されています。

更新はINSERTの後に機能します。 TRIGGERは同じデータベース上にある場合は機能しません(無限ループになる可能性があります)

これは、挿入する前に使用しているプログラミング言語で行います。あなたが挿入を行うときに準備ができた名前を挿入するようにしてください。