2

私は次の声明を持っています:

INSERT INTO `Properties`(`Id`, `Url`, `BrokerId`, `LastFound`) VALUES
(@Id,@Url,@BrokerId,@LastFound)
ON DUPLICATE KEY UPDATE LastFoundOn = @LastFoundOn;

INSERT INTO `Events`(`Id`, `Type`, `DateTime`, `PropertyId`) VALUES
(@EventId,@EventType,@Now,@Id);

Properties.Id と Events.PropertyId の間には外部キー制約があります。また、URL は一意です。

これは機能します-ほとんど。recod が挿入されず、重複キー (Url) のために更新された場合、イベントへの挿入は失敗します。これは、外部キーが単に存在しないためです。このような:

例えば:

exists:    1  |  http://test1.com  |  2  |  2013-03-13
to insert: 2  |  http://test2.com  |  2  |  2013-03-14

挿入しようとすると、一意の URL のため、代わりに更新されます。後でイベントを挿入しようとすると、プロパティ テーブルに外部キー (2) が存在しません。このシナリオを処理する if then ステートメントを作成するにはどうすればよいですか?

何かのようなもの (?):

INSERT INTO `Properties`(`Id`, `Url`, `BrokerId`, `LastFound`) VALUES
(@Id,@Url,@BrokerId,@LastFound)
ON DUPLICATE KEY UPDATE LastFoundOn = @LastFoundOn;
IF LastInserted = @Id THEN
INSERT INTO `Events`(`Id`, `Type`, `DateTime`, `PropertyId`) VALUES
(@EventId,@EventType,@Now,@Id);
END IF;

アップデート:

トリガーは解決策かもしれませんが、私はそれを機能させるのに苦労しています。ここで何が問題なのですか?

DELIMITER $$
CREATE TRIGGER Event_Submitted_Trigger AFTER INSERT ON Properties 
FOR EACH ROW
BEGIN
INSERT INTO Events VALUES(SELECT(UUID()), 'PropertySubmitted', SELECT(NOW()), new.Id);
END$$

次のエラーが表示されます: #1064 - SQL 構文にエラーがあります。'SELECT(NOW()), new.Id); の近くで使用する正しい構文については、MySQL サーバーのバージョンに対応するマニュアルを確認してください。4 行目の END$$'

よろしくお願いします、

セーレン

アップデート:

ここに私のスキーマがあります:

CREATE TABLE IF NOT EXISTS `Events` (
  `Id` char(36) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
  `Type` enum('PropertySubmitted','PropertyChanged','PropertyRemoved') NOT NULL,
  `DateTime` datetime NOT NULL,
  `Attribute` varchar(128) NOT NULL,
  `From` varchar(512) NOT NULL,
  `To` varchar(512) NOT NULL,
  `PropertyId` char(36) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
  PRIMARY KEY (`Id`),
  KEY `IX_FK_PropertyEvent` (`PropertyId`),
  KEY `DateTimeIndex` (`DateTime`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- --------------------------------------------------------

--
-- Table structure for table `Properties`
--

CREATE TABLE IF NOT EXISTS `Properties` (
  `Id` char(36) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
  `Url` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
  `Type` varchar(64) NOT NULL,
  `ExtractedAddress` varchar(192) NOT NULL,
  `ExtractedPostcode` varchar(8) NOT NULL,
  `ExtractedCity` varchar(64) NOT NULL,
  `StreetName` varchar(128) DEFAULT NULL,
  `StreetNumber` varchar(8) DEFAULT NULL,
  `Floor` varchar(8) DEFAULT NULL,
  `Side` varchar(8) DEFAULT NULL,
  `DoorNo` varchar(8) DEFAULT NULL,
  `Postcode` int(4) DEFAULT NULL,
  `City` varchar(64) DEFAULT NULL,
  `Latitude` double DEFAULT NULL,
  `Longitude` double DEFAULT NULL,
  `ImageUrl` varchar(512) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
  `Price` int(8) NOT NULL,
  `Payout` int(8) NOT NULL,
  `GrossPrice` int(6) NOT NULL,
  `NetPrice` int(6) NOT NULL,
  `Area` int(5) NOT NULL,
  `GroundArea` int(5) NOT NULL,
  `Rooms` int(2) NOT NULL,
  `Year` int(4) NOT NULL,
  `PriceChange` int(11) NOT NULL,
  `FirstFoundOn` datetime NOT NULL,
  `SubmittedOn` datetime NOT NULL,
  `LastFoundOn` datetime NOT NULL,
  `FoundAt` varchar(256) DEFAULT NULL,
  `Validated` tinyint(1) NOT NULL,
  `BrokerId` char(36) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
  `Archived` tinyint(1) NOT NULL DEFAULT '0',
  PRIMARY KEY (`Id`),
  UNIQUE KEY `Url` (`Url`),
  KEY `IX_FK_PropertyBroker` (`BrokerId`),
  KEY `UrlIndex` (`Url`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

--
-- Triggers `Properties`
--
DROP TRIGGER IF EXISTS `Event_Submitted_Trigger`;
DELIMITER //
CREATE TRIGGER `Event_Submitted_Trigger` AFTER INSERT ON `Properties`
 FOR EACH ROW BEGIN
 INSERT INTO `Events` VALUES(UUID(), 'PropertySubmitted', NOW(), NEW.Id);
END
//
DELIMITER ;

--
-- Constraints for dumped tables
--

--
-- Constraints for table `Events`
--
ALTER TABLE `Events`
  ADD CONSTRAINT `Events_ibfk_1` FOREIGN KEY (`PropertyId`) REFERENCES `Properties` (`Id`) ON DELETE CASCADE ON UPDATE CASCADE;

--
-- Constraints for table `Properties`
--
ALTER TABLE `Properties`
  ADD CONSTRAINT `Properties_ibfk_2` FOREIGN KEY (`BrokerId`) REFERENCES `Brokers` (`Id`) ON DELETE NO ACTION ON UPDATE NO ACTION;
4

1 に答える 1

0

次の構造を想定しています。

CREATE TABLE Properties (
    id         INT,
    url        VARCHAR(100),
    lastFound  DATETIME,
    UNIQUE (url)
) ;

CREATE TABLE Events (
    id         VARCHAR(36),
    type       VARCHAR(20),
    t          DATETIME,
    propertyId INT
) ;

これが有効なトリガーです。

DELIMITER $$
CREATE TRIGGER Event_Submitted_Trigger AFTER INSERT ON Properties 
FOR EACH ROW BEGIN
    INSERT INTO Events VALUES( UUID(), 'PropertySubmitted', NOW(), new.Id);
END $$
DELIMITER ;

実際の動作はこちらでご覧ください。ハックに注意してください。これNOW()+SLEEP(1)は、重要な結果を得るために実行を遅らせることのみを目的としています (SLEEP()中断されない場合は 0 を返します)。

于 2013-03-19T15:38:47.693 に答える