簡體   English   中英

使用mysql在某些條件下刪除行

[英]Deleting a row in certain conditions with mysql

我希望在表(如下所示)獲得新插入時自動刪除行,如果滿足某些條件。

什么時候:

  • 有些行引用相同的“字段”,具有相同的“user_id”
  • 他們的“字段”,“顯示”和“搜索”列是相同的

簡單地說,當行變為重復(“group_id”列除外)時,應刪除非null“group_id”,否則應更新或插入行。

有沒有辦法在mysql中設置它(在“ON DUPLICATE do stuff ”的精神與獨特的鍵等結合),或者我是否必須在php中顯式檢查它(有多個查詢)?

附加信息:對於每個可能的“字段”,應該總是有一行NULL'group_id'(有一個有限的集合,在別處定義)。 另一方面,可能沒有一個非null'group_id'。

CREATE TABLE `Views` (
`user_id` SMALLINT(5) UNSIGNED NOT NULL,
`db` ENUM('db_a','db_b') NOT NULL COLLATE 'utf8_swedish_ci',
`field` VARCHAR(40) NOT NULL COLLATE 'utf8_swedish_ci',
`display` TINYINT(1) UNSIGNED NOT NULL,
`search` TINYINT(1) UNSIGNED NOT NULL,
`group_id` SMALLINT(6) UNSIGNED NULL DEFAULT NULL,
UNIQUE INDEX `user_id` (`field`, `db`, `user_id`),
INDEX `Views_ibfk_1` (`user_id`),
INDEX `group_id` (`group_id`),
CONSTRAINT `Views_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `User` (`id`) ON
UPDATE CASCADE ON DELETE CASCADE
)
COLLATE='utf8_swedish_ci'
ENGINE=InnoDB;

我認為你需要修改你的邏輯。 僅插入一行來刪除另一行是沒有意義的。 為什么不直接將重復行中的Group_ID字段更新為插入的內容? 以下是我將如何進行的粗略概念。

SET @User_ID = 1;
SET @db = 'db_a';
SET @Field = 'Field';
SET @Display = 1;
SET @Search = 1;
SET @Group_ID = 1;

IF EXISTS
    (   SELECT  1
        FROM    Views
        WHERE   User_ID = @User_ID
        AND     DB = @DB
        AND     Field = @Field
        AND     Group_ID IS NOT NULL
    ) 
    THEN
        UPDATE  Views
        SET     Group_ID = @Group_ID,
                Display = @Display,
                Search = @Search
        WHERE   User_ID = @User_ID
        AND     DB = @DB
        AND     Field = @Field
        AND     Group_ID IS NOT NULL
ELSE
        INSERT INTO Views (User_ID, DB, Field, Display, Search, Group_ID)
        VALUES (@User_ID, @DB, @Field, @Display, @Search, @Group_ID)
END IF;

或者(和我的首選解決方案),在表中添加一個Timestamp字段並創建一個視圖,如下所示:

SELECT  v.User_ID, v.DB, v.Field, v.Display, v.Search, v.Group_ID
FROM    Views v
        INNER JOIN
        (   SELECT  User_ID, DB, Field, MAX(CreatedDate) AS CreatedDate
            FROM    Views
            WHERE   Group_ID IS NOT NULL
            GROUP BY User_ID, DB, Field
        ) MaxView
            ON MaxView.User_ID = v.User_ID
            AND MaxView.DB = v.DB
            AND MaxView.Field = v.Field
            AND MaxView.CreatedDate = v.CreatedDate
WHERE    v.Group_ID IS NOT NULL
UNION ALL
SELECT  v.User_ID, v.DB, v.Field, v.Display, v.Search, v.Group_ID
FROM    Views v
WHERE   v.Group_ID IS NULL

這樣您就可以正確跟蹤數據更改,而不會影響查看唯一記錄的必要性。

從視圖中刪除group_id,其中group_id!='NUll'

你的問題不是很好理解,所以我不確定這是你想要的:

DELETE FROM Views WHERE # delete from the table views
  group_id IS NOT NULL AND  # first condition delete only rows with not null group_id
  (SELECT count(*) as tot FROM Views GROUP BY group_id) = 1 # second condition count the difference in group id

如果這不是您想要的,請更新您的問題以獲取更多詳細信息......

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM