3

テーブルに挿入しようとすると、Operand should contain 1 column(s)mysqlエラーが発生しますsets

私はグーグルで検索し、同様の質問の山を見つけましたが、それらは常に彼らの当面の問題を解決するためのピンポイント固有のものです。ちなみに私はmysql5.6を持っています。複数のタイムスタンプが許可されています。

これが私のコードです:

INSERT INTO `sets` (`tabler_name`) VALUES ("leads_auto");

これが私のテーブルです:

CREATE TABLE IF NOT EXISTS `lms`.`sets` (
    `set_id` BIGINT NOT NULL AUTO_INCREMENT,
    `on_off` SMALLINT NOT NULL DEFAULT 0,
    `tabler_name` VARCHAR(45) NULL,
    `origin_date` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    `last_modified_date` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    `original_count` INT NULL,
    `current_count` INT NULL,
    `source_type` VARCHAR(45) NULL,
    `source` VARCHAR(45) NULL,
    `method` VARCHAR(45) NULL,
    `agent` VARCHAR(45) NULL,
    `dupes` INT NULL,
    `bads` INT NULL,
    `aged` INT NULL COMMENT 'This table keeps track of the record sets that enter the system.        Example: a set of leads imported into the database.',
    PRIMARY KEY (`set_id`)
) ENGINE = InnoDB;

ストアドプロシージャ:

DELIMITER //

CREATE PROCEDURE `lms`.`leads_to_bak` ()
BEGIN
SET @table1 = (SELECT `tabler_name` FROM sets WHERE on_off=0 LIMIT 1);
SET @table2 = CONCAT(@table1, '_bak');
SET @SQL1 = CONCAT('INSERT INTO ',@table2, '(', (SELECT
REPLACE(GROUP_CONCAT(COLUMN_NAME), 'lead_id,', '') FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = @table2), ')', ' SELECT ', (SELECT                                                                   REPLACE(GROUP_CONCAT(COLUMN_NAME), 'lead_id,', '') FROM INFORMATION_SCHEMA.COLUMNS WHERE       TABLE_NAME = @table1), ' FROM ', @table1);
PREPARE stmt FROM @sql1;
EXECUTE stmt;
END//

DELIMITER ;
USE `lms`;

引き金

DELIMITER $$

USE `lms`$$

CREATE TRIGGER `lms`.`after_insert_into_leads`
AFTER INSERT ON `sets` FOR EACH ROW
BEGIN
IF (SELECT * FROM sets WHERE on_off=0 LIMIT 1) THEN
CALL lms.leads_to_bak();
END IF;
END$$

DELIMITER ;
USE `lms`;

ルーチンに問題はありません。ルーチンとトリガーを削除すると、問題が解決するようです。

4

3 に答える 3

3

あなたの引き金で、あなたはEXISTS後に置くつもりでしたIFか?このような:

CREATE TRIGGER `lms`.`after_insert_into_leads`
AFTER INSERT ON `sets` FOR EACH ROW
BEGIN
IF EXISTS (SELECT * FROM sets WHERE on_off=0 LIMIT 1) THEN
CALL lms.leads_to_bak();
END IF;
END$$
于 2012-09-24T12:54:33.863 に答える
0

テーブル名をエスケープしてください。予約された関数のようです。ローカルで定義したかどうかはわかりません。

INSERT INTO `sets` (tabler_name) VALUES ("leads_auto");

また、1つのデータベースafaikに2つのタイムスタンプフィールドを含めることはできません。問題が発生した場合は、2つのタイムスタンプのいずれかをDATETIMEフィールドに変更します

于 2012-09-24T04:02:25.770 に答える
0

ステートメント内のフィールド名をエスケープする以外に、INSERTあまり改善することはできません。しかし、私のテスト環境ではエラーは発生しません。これは本当にあなたにエラーを投げる正確なステートメントですか?

ただし、テーブル定義にわずかな問題があります。

テーブル定義が正しくありません。DEFAULTまたはONUPDATE句にCURRENT_TIMESTAMPを含むTIMESTAMP列は1つだけです。

エラーメッセージが示すように、で使用できる列は1つだけです。複数のtimestampCURRENT_TIMESTAMPが必要な場合は、トリガーを使用してこれを行うことができます。

于 2012-09-24T04:07:01.790 に答える