我想你是在查询结果中(作为开发人员)有趣的,但不是确切的表内容(属于上的责任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
你可能会感兴趣的如何使用触发器做 docs和wise 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
了很多办法,其中一些能满足您的要求。
@WernfriedDomscheit - 对不起,错字本应该是 - not =。 –
@AbIrChanda - 要求仍然没有意义。我发布的'update'语句将完全按照您的要求进行操作。这不是一个明智的做法。 –
如果我删除了第四个记录, CUST_ID cust_name长度 ======= ====== 1穆尼尔 2巴布 3 ABIR 5 debsu 更新查询不工作这一个。 –