一个触发器,它将使用路径更新列

时间:2013-05-07 11:42:15

标签: php mysql sql

我需要在项目添加到表格后立即用路径更新列“路径”。我正在使用mySql和PHP。

"id"    "name"         "description"               "level"  "parent"    "country"   "path"
"1"     "Kitchenware"   "Kitchenware description"   "1"       "0"         "US"        "Kitchenware"
"2"     "Knives"        "All our knives"            "2"       "1"         "US"        "Kitchenware > Knives"
"3"     "Butter Knives" "All Butter Knives"         "3"       "2"         "US"        "Kitchenware > Knives > Butter Knives"
"4"     "Cut em all"    "Cut em all"                "4"       "3"         "US"        "Kitchenware > Knives > Butter Knives > Cut em all"
"5"     "Cull em all"   "Cull em all"               "4"       "3"         "US"        
"6"     "Smear em all"  "Smear em all"              "4"       "3"         "US"        
"7"     "Meat Knives"   "All Meat Knives"           "3"       "2"         "US"        
"8"     "Cut em meat"   "Cut em meat"               "4"       "7"         "US"        
"9"     "Cull em meat"  "Cull em meat"              "4"       "7"         "US"        
"10"    "Smear em meat" "Smear em meat"             "4"       "7"         "US"        

关于如何做到这一点的好方法?

在此表中,第1级是最重要的。 2和3正在前进。 4是项目。

我有点坚持这样做(触发器中的选择)。它需要在每次插入后运行。不是一次全部。

2 个答案:

答案 0 :(得分:1)

您需要一个存储过程而不是触发器,因为它有一个限制:

  

在存储的函数或触发器中,不允许修改a   已经被使用(用于读或写)的表   调用函数或触发器的语句。

但是使用存储过程,您可以:

  

虽然某些限制通常适用于存储的功能和   触发但不是存储过程,这些限制确实适用于   存储过程,如果它们是从存储的函数中调用的   触发。

DOCS

这样的事情:

CREATE PROCEDURE `build_path`(IN row_id INT, IN path_name VARCHAR(255))
BEGIN

UPDATE `my_table` SET `path`=path_name WHERE `id`=row_id;

END$$

示例调用是CALL build_path(1,'Kitchenware');

假设您已经构建了路径,则可以更改该过程以构建路径。

<强>更新

构造路径的查询。注意:自连接数= MAX(级别)

SELECT
    CONCAT(
        m1.path,
        IF(m2.path IS NULL,'',CONCAT(' > ',m2.path)),
        IF(m3.path IS NULL,'',CONCAT(' > ',m3.path)),
        IF(m4.path IS NULL,'',CONCAT(' > ',m4.path))
    ) as za_path
FROM 
    my_table as m1
LEFT JOIN my_table as m2
    ON m2.parent = m1.id
LEFT JOIN my_table as m3
    ON m3.parent = m2.id
LEFT JOIN my_table as m4
    ON m4.parent = m3.id
WHERE 
    m1.id = 8

答案 1 :(得分:0)

请尝试此跳,此示例将解决您的问题

CREATE TRIGGER dbo.trgforyou ON YourTable
FOR INSERT
AS
DECLARE @ID INT
SELECT @ID=inserted.iID From inserted


update Table set "name = '',description='',level='',parent='',country=''path='' Where iid = @ID