1

行内の画像ファイルに名前を付けるためにIDを使用したい。クエリ自体の中で (現在の) 行の ID を使用する方法はありますか。( lastInsertId() については知っていますが、通常はクエリの後で機能し、クエリの内部では機能しません。)

INSERT INTO table (id, intro, detail, image) 
VALUES (null, introtext, detailtext, get_the_id_of_this_query_itself.jpg ) 

この画像の拡張子 (.jpg など) を保存して、後でそれを記事の ID と一緒に使用できることを知っています。しかし、私はこれが可能かどうか疑問に思いました。

後で追加: max(id) を 1 ずつインクリメントしてから、画像名に .jpg 文字列を追加する挿入クエリ内でサブクエリを使用できますか?

4

3 に答える 3

0

挿入前に ID がどうなるかを知ることはできません。また、このデータを実際の値として使用することもお勧めしません。この列は、行の透過的な識別子であると想定されています。これはJOINs に役立ちます。検索に便利であるという事実は偶発的なものであり、信頼すべきではありません。

この ID は、いつでも変更できるものとして扱う必要があります。序数などの別の識別子が必要な場合は、別のフィールドに格納し、アプリケーションで処理する必要があります。

このスクリプトが高速でアクセスされていると想像してください。これらのINSERTクエリの多くは同時に (異なるサーバー上でさえ) 実行される可能性があるため、クエリが完了するまで ID を知ることはできません。クエリが完了した後でも、レプリケーションの同期後に ID が変更され、image列のデータに一貫性がなくなる場合があります。

于 2013-10-28T15:26:07.913 に答える
0

技術的には、シーケンス用の別のテーブルとBEFOREトリガーを使用して MySQL でこれを実現できますが、

テーブル スキーマ:

CREATE TABLE articles_seq 
(
  id INT NOT NULL AUTO_INCREMENT PRIMARY KEY
);
CREATE TABLE articles
(
  `id` INT NOT NULL PRIMARY KEY DEFAULT 0, 
  `intro` VARCHAR(128), 
  `detail` VARCHAR(128), 
  `image` VARCHAR(128)
);

引き金:

DELIMITER $$
CREATE TRIGGER tg_bi_articles
BEFORE INSERT ON articles
FOR EACH ROW
BEGIN
  INSERT INTO articles_seq () VALUES ();
  SET NEW.id = LAST_INSERT_ID(), 
      NEW.image = CONCAT(NEW.id, '.jpg');
END$$
DELIMITER ;

このようにレコードを挿入できるようになりました

INSERT INTO articles (`intro`, `detail`, `image`) VALUES 
('Intro text 1', 'Details text 1', '.jpg'),
('Intro text 2', 'Details text 2', '.png');

結果:

| | ID | はじめに | 詳細 | 画像 |
|----|--------------|----------------|-------|
| | 1 | 紹介文 1 | 詳細テキスト 1 | 1.jpg |
| | 2 | 導入文 2 | 詳細テキスト 2 | 2.jpg |

これがSQLFiddleのデモです

あなたはそれなしで良いです。代わりにビューを使用できます

CREATE TABLE articles
(
  `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY, 
  `intro` VARCHAR(128), 
  `detail` VARCHAR(128), 
  `ext` VARCHAR(32)
);

CREATE VIEW vw_articles AS
SELECT id, intro, detail, CONCAT(id, '.', ext) image
  FROM articles;

これがSQLFiddleのデモです

于 2013-10-28T15:31:41.667 に答える