【问题标题】:How to use composite primary key for deletion如何使用复合主键进行删除
【发布时间】:2018-03-13 08:40:15
【问题描述】:

我是数据库新手,我的问题是如何使用复合主键进行删除。这是我的表结构,

CREATE TABLE DevProj (
    DeveloperID int NOT NULL,
    ProjectID int NOT NULL,
    WorkDate Datetime,
    WorkingHours int,
    Overtime int,
    Descriptions varchar(255),
    Primary key(DeveloperID,ProjectID,WorkDate) 
);

insert into DevProj (DeveloperID,ProjectID,WorkDate,WorkingHours,Overtime,Descriptions) values
(1,2,'2018-1-1',10,5,'done all'),
(1,2,'2018-1-2',10,5,'done C++'),
(1,3,'2018-1-1',10,5,'done C#'),
(2,2,'2018-1-3',10,5,'done JAVA'),
(3,3,'2018-1-4',10,5,'done SQL');

假设我需要删除(1,2,'2018-1-1',10,5,'done all')这条记录,我该怎么做,有复合主键,没有单独的列作为主键可以像这样删除,例如:Delete from devProj where id = 1。那么,我该怎么做为删除记录编写查询,我在更新时也遇到了这个问题。

【问题讨论】:

    标签: mysql sql-update sql-delete composite-primary-key


    【解决方案1】:

    或者,删除多条记录:

    DELETE FROM DevProj 
    WHERE (DeveloperID, ProjectID, WorkDate) IN ((1,2,'2018-1-1'), ((1,2,'2018-1-2'))
    

    其他性能注意事项

    但请注意,如果您的 MySQL 版本低于 5.7.11,这将无法利用索引优化(请参阅https://dev.mysql.com/doc/refman/5.7/en/range-optimization.html#row-constructor-range-optimization)。在这种情况下,您应该使用 AND/OR 运算符:

    DELETE FROM DevProj 
    WHERE (DeveloperID = 1 AND ProjectID = 2 AND WorkDate = '2018-1-1') 
    OR (DeveloperID = 1 AND ProjectID = 2 AND WorkDate = '2018-1-2')
    

    【讨论】:

      【解决方案2】:

      如果要删除基于复合主键的记录,可以使用 MySQL 的简写:

      DELETE
      FROM DevProj
      WHERE (DeveloperID, ProjectID, WorkDate) = (1, 2, '2018-01-01');
      

      或者你可以使用更长的版本:

      DELETE
      FROM DevProj
      WHERE
          DeveloperID = 1 AND
          ProjectID = 2 AND
          WorkDate) = '2018-01-01';
      

      【讨论】:

      • 谢谢您,先生,我可以使用另一个带有复合主键的键吗,我的意思是,像这样。 DevProjID int NOT NULL AUTO_INCREMENT, Primary key(DevProjID)这是好事还是坏事?如果我这样使用,我可以编写删除查询。 Delete from devProj where DevProjID= 1
      • 我不明白你在问什么。我在您的表中没有看到任何名为 DevProjID 的列。
      • 不不,我的意思是如果我为表格添加额外的列,称为DevProjIDCREATE TABLE DevProj ( DevProjID int NOT NULL AUTO_INCREMENT, DeveloperID int NOT NULL, ProjectID int NOT NULL, WorkDate Datetime, WorkingHours int, Overtime int, Descriptions varchar(255), Primary key(DevProjID), Primary key(DeveloperID,ProjectID,WorkDate) );
      • 我认为 MySQL 表只能有一个主键。只需尝试该语法,您就会发现它失败了。
      • 是的。我做不到,显示此错误。 1068。定义了多个主键 我认为我使用 DevProjID 不作为主键。我可以使用这个查询Delete from devProj where DevProjID= 1,因为它比写一个像DELETE FROM DevProj WHERE (DeveloperID, ProjectID, WorkDate) = (1, 2, '2018-01-01'); 这样的查询容易吗?这是错的吗?
      猜你喜欢
      • 2014-03-16
      • 2017-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多