2015-11-11 61 views
-1

假设我有一个像这样的表:如何删除记录并相应地更改其他记录的ID?

cust_id cust_name 
======= ======== 
1   monir 
2   babu 
3   abir 
4   bro 
5   debsu 

如果删除的第一行,该表变为:

cust_id cust_name 
======= ======== 
2   babu 
3   abir 
4   bro 
5   debsu 

但我想cust_name = 'babu'行有cust_id = 1和的休息记录在我删除第一条记录时自动减少cust_id

这意味着新的表应该是这样的:

cust id custname 
======= ======== 
1   babu 
2   abir 
3   bro 
4   debsu 

怎么办呢?

回答

3

该要求没有意义。改变行的主键是你应该努力避免的。特别是像customer_id这很可能在多个子表中。更新表中的每一行,因为一行被删除也将非常昂贵。

这就是说,如果你确定,你可以只

update customer 
    set customer_id = customer_id - 1 
where customer_id > 1; 
+0

@WernfriedDomscheit - 对不起,错字本应该是 - not =。 –

+0

@AbIrChanda - 要求仍然没有意义。我发布的'update'语句将完全按照您的要求进行操作。这不是一个明智的做法。 –

+0

如果我删除了第四个记录, CUST_ID cust_name长度 ======= ====== 1穆尼尔 2巴布 3 ABIR 5 debsu 更新查询不工作这一个。 –

0

我想你是在查询结果中(作为开发人员)有趣的,但不是确切的表内容(属于上的责任DBA)。因此开发人员的一个有益实践是尽量减少与数据库表的直接交互 - 并且作为最简单的解决方案,您可以创建适合自定义需求的视图。

让我们修改您的示例,试图避免主键杂耍(如Justin Cave所说),并放置一个标志列,向我们显示哪些用户处于活动状态。

CREATE TABLE myTable(
    cust_id NUMBER(10), 
    cust_name VARCHAR2(1000), 
    is_active CHAR(1) DEFAULT 'Y' 
); 

CREATE VIEW myView AS 
SELECT rownum  AS cust_effective_id 
    , t.cust_name AS cust_name 
    , t.cust_id AS cust_real_id 
    -- last column just for control so you see what's happening 
    FROM (SELECT * 
      FROM myTable 
     WHERE is_active = 'Y' 
     ORDER BY cust_id) t; 

让我们插入一些记录

INSERT INTO myTable (cust_id, cust_name) 
    SELECT 1 AS cust_id, 'monir' AS cust_name FROM dual 
    UNION ALL SELECT 2, 'babu' FROM dual 
    UNION ALL SELECT 3, 'abir' FROM dual 
    UNION ALL SELECT 4, 'bro' FROM dual 
    UNION ALL SELECT 5, 'debsu' FROM dual 

现在,我们可以看到他们查询myView

SELECT * FROM myView 

CUST_EFFECTIVE_ID | CUST_NAME | CUST_REAL_ID 
-------------------------------------------- 
     1   |  monir |  1 
     2   |  babu |  2 
     3   |  abir |  3 
     4   |  bro |  4 
     5   |  debsu |  5 

现在istead删除记录的,我们把它标记为未激活

UPDATE myTable SET is_active = 'N' WHERE cust_id = 1 

你可能会感兴趣的如何使用触发器做 docswise man会帮助你,但在这里我不会让你疲倦并发症。

并再次让我们看看我们在视图中获得:

SELECT * FROM myView 

CUST_EFFECTIVE_ID | CUST_NAME | CUST_REAL_ID 
-------------------------------------------- 
     1   |  babu |  2 
     2   |  abir |  3 
     3   |  bro |  4 
     4   |  debsu |  5 

我们看到CUST_EFFECTIVE_ID作了相应的改变。

注意,那上面只是显示一个方向的划痕:灵活性Oracle数据库为我们提供了几乎是取之不尽,用之不竭的,你可以自定义myView了很多办法,其中一些能满足您的要求。

+0

好吧,我想要的正是我上面所说的,没有主键, 和I dnt想要使用视图, 可能是我可以使用一个函数或一个过程来完成任务,以减少cust_id为每个现有的cust_name,这意味着cust_id应该总是从1开始删除一些记录后,, 我不知道这是可能的否则,但如果是,那么告诉我该怎么做,可能是在创建表格的时候。 谢谢 –