これ何て呼びますか

フィールドがいくつかあるテーブルがあります。
主キーが78532456から始まり、1ずつ増加します。
これを1万行追加したいです。
MYISAMでやっています。

どのようにすれば、重複な値を出さずに追加できますか。

A 回答 (5件)

ストアドプロシージャを利用しましょう



//準備
//idをプライマリにダミーでdataカラムをつくっておきます
create table hoge(id bigint not null primary key,data varchar(10));
//そもそもプライマリにすればidは重複しません


//ここからプロシージャの宣言

DROP PROCEDURE IF EXISTS PROC_ADDID;
DELIMITER //
CREATE PROCEDURE PROC_ADDID(IN start_id BIGINT,IN range_id INT)
BEGIN
DECLARE i INT DEFAULT 0;
WHILE i<range_id DO
INSERT IGNORE INTO `hoge`(`id`) VALUES(start_id + i);
SET i=i+1;
END WHILE;
END
//
DELIMITER ;

//ここまで

//mから始まるn個のデータをつくるには CALL PROC_ADDID(m,n);

CALL PROC_ADDID(78532456,10000);
    • good
    • 0
この回答へのお礼

有難うございます。やってみましたが解決しませんでした。すでに10行分データを入れた状態で、主キーを設定し、データを入れている状態なので、create table hoge(id bigint not null primary key,data varchar(10));はやりませんでした。

DROP PROCEDURE IF EXISTS PROC_ADDID;# 返り値が空でした (行数 0)。

DELIMITER //
CREATE PROCEDURE PROC_ADDID(IN start_id BIGINT,IN range_id INT)
BEGIN
DECLARE i INT DEFAULT 0;
WHILE i<range_id DO
INSERT IGNORE INTO `maintable`(`no`) VALUES(start_id + i);
SET i=i+1;
END WHILE;
END
//
# 返り値が空でした (行数 0)。

DELIMITER ;

CALL PROC_ADDID(78532456,10000);# 返り値が空でした (行数 0)。

お礼日時:2012/06/29 19:30

UPDATE テーブル SET 更新日時フィールド=now(),作成日時フィールド=now()



じゃだめなの?
    • good
    • 0
この回答へのお礼

できました。有難うございました。

お礼日時:2012/07/02 14:09

>テーブルには、afieldが更新されたときに更新される日時が入るupdate_dayと


>作成したときの日時が入るnew_dayがあります。

>更新日時 update_day timestamp null DEFALT null
>作成日時 new_day timestamp null DEFALT null

ごめんなさい。補足の意味がわからないのだけど
更新日時にしても作成日時にしてもどうしたいの?

たとえば、
・xxxx年xx月xx日からyyyy年yy月yy日の間のランダムの値にする
・更新日時はかぶってはいけない(単純なランダムより結構やっかい)
・ID順に更新日はバックデートしてはいけない(これはすごく面倒)
・更新日時は作成日時と同じか新しくなくてはいけない

みたいに書かないとエスパーじゃないんだから他人には伝わらないよ
    • good
    • 0
この回答へのお礼

>・xxxx年xx月xx日からyyyy年yy月yy日の間のランダムの値にする
年月日の表示で、ランダムでなくていいです。

>・更新日時はかぶってはいけない(単純なランダムより結構やっかい)
かぶってもいいです。

>・ID順に更新日はバックデートしてはいけない(これはすごく面倒)
>・更新日時は作成日時と同じか新しくなくてはいけない
レコードを作成したときは、更新日時と作成日時が同じになっています。
更新日はafieldのデータを更新したときだけ、その都度更新させます。
そのとき作成日時は更新しないで常に作成した日にします。

お礼日時:2012/07/02 13:11

>主キーだけが入って、その他のフィールドは空っぽのレコードがずらっとできました。



そういう風にかきましたよ、それ以外の仕様書いてなかったし
そもそもテーブルの構成もわからないし

>主キーがXXX~XXXまでの間のAフィールドをXXX、BフィールドをXXX、
>とそれぞれ設定してUPDATEを実行。
>上以外の主キーがXXX~XXXまでの間の・・・
>さらに上以外の主キーがXXX~XXXまでの間の

INSERTの方法によってはできるんじゃないでしょうかねぇ
ある程度仕様をだしてもらえば考えてみやすよ
    • good
    • 0
この回答へのお礼

すみません。有難うございます。

テーブルには、afieldが更新されたときに更新される日時が入るupdate_dayと
作成したときの日時が入るnew_dayがあります。

更新日時 update_day timestamp null DEFALT null
作成日時 new_day timestamp null DEFALT null

DELIMITER $$

CREATE TRIGGER tri1 BEFORE UPDATE ON dbtable FOR EACH ROW
BEGIN
IF NEW.afield != OLD.afield THEN SET NEW.update_day = now(); END IF;
END;
$$

DELIMITER ;

お礼日時:2012/07/02 06:57

>INSERT IGNORE INTO `maintable`(`no`) VALUES(start_id + i);



MySQLのバージョンはいくつでしょうか?

たとえば
CALL PROC_ADDID(100,100);
など小さめの数でやってみていけますか?
    • good
    • 0
この回答へのお礼

5.0.51aです。
主キーだけが入って、その他のフィールドは空っぽのレコードがずらっとできました。
これで正しくできたのでしょうか。

それぞれのフィールドにデータを入れていくのは、できればバラバラのデータを入れたいです。

主キーがXXX~XXXまでの間のAフィールドをXXX、BフィールドをXXX、とそれぞれ設定してUPDATEを実行。
上以外の主キーがXXX~XXXまでの間の・・・
さらに上以外の主キーがXXX~XXXまでの間の・・・

それを何十通りもやる、みたいなやり方になりますか。

お礼日時:2012/06/30 00:20

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す