阅读后,我意识到SQL(我的情况下 MySQL )不支持列排除。
SELECT *, NOT excluded_column FROM table; /* shame it doesn't work */
无论如何,虽然我接受了这一点,但我想知道是否有任何体面的解决方法来实现这种行为。原因是,我正在创建一个视图来整合几个表格中的信息。
我已将一些用户数据规范化为表user
和user_profile
等等;目的是user
存储对用户操作至关重要的数据,user_profile
存储非关键数据。应用程序要求仍在实现中,因此根据需要在user_profile
中添加/删除列,并且可以在视图中包含的行中支持更多表。
问题是,当我创建视图时,我得到Error 1060: Duplicate Column Name
,因为两个表中都存在user_id
。
现在,我到目前为止提出的解决方案基本上是:
/* exclude user_id from user */
SELECT user.critical_field, user.other_critical_field,
user_profile.*
FROM user
LEFT JOIN user_profile
ON user.user_id = user_profile.user_id;
由于user
表在整个应用程序生命周期中保持不变(希望),这已经足够了,但我只是好奇是否存在更加动态的方法。
(表名不是copypasta,我知道user
通常是自己命名约定的不良选择,我使用前缀。)
答案 0 :(得分:1)
通常,我会在视图中定义我想要的字段
使用您的示例:
SELECT user.critical_field, user.other_critical_field,
user_profile.User_Id, user_profile.MyOtherOfield
FROM user
LEFT JOIN user_profile
ON user.user_id = user_profile.user_id;
现在,另外,我会确保我正确地使用别名:
SELECT u.critical_field, u.other_critical_field,
up.User_Id, up.MyOtherOfield, u.KeyField AS userKey, up.KeyField as ProfileKey
FROM user as u
LEFT JOIN user_profile as up
ON u.user_id = up.user_id;
这使我能够确保我知道我的视图中的内容,以及智能地命名列,但这确实意味着当我对基础表结构进行更改时,我需要触摸该视图。