我试图从Oracle中提取有关外键的一些元数据.我使用"all_constraints"查找所有引用约束信息,使用"all_cons_columns"查找实际列.但是,我无法在外键中获取列的顺序.
下面是4个包含3列的示例表.其中3个表引用表"tab_d",但外键中列的顺序不同.此订单未反映在"all_cons_columns"视图中,那么是否有其他可用信息的位置?
create table tab_d (
col_a int,
col_b int,
col_c int,
constraint tab_d_pk primary key (col_a, col_b, col_c)
);
create table tab_e (
ref_col_a int,
ref_col_b int,
ref_col_c int,
constraint tab_e_fk foreign key (ref_col_b, ref_col_c, ref_col_a)
references tab_d(col_b, col_c, col_a)
);
create table tab_f (
ref_col_a int,
ref_col_b int,
ref_col_c int,
constraint tab_f_fk foreign key (ref_col_b, ref_col_c, ref_col_a)
references tab_d(col_c, col_a, col_b)
);
create table tab_g (
ref_col_a int,
ref_col_b int,
ref_col_c int,
constraint tab_g_fk foreign key (ref_col_c, ref_col_b, …Run Code Online (Sandbox Code Playgroud) 我有一个Oracle DB模式,其中包含一个"用户"表.此表有两个非空外键给编辑器和创建者,它们也是用户.
架构转储如下所示:
create_table "users", :force => true do |t|
t.integer "creator_id", :precision => 38, :scale => 0, :null => false
t.integer "editor_id", :precision => 38, :scale => 0, :null => false
end
add_foreign_key "users", "users", :column => "creator_id", :name => "r_user_creatorid", :dependent => :nullify
add_foreign_key "users", "users", :column => "editor_id", :name => "r_user_editorid", :dependent => :nullify
Run Code Online (Sandbox Code Playgroud)
我的用户模型如下所示:
class User < ActiveRecord::Base
belongs_to :creator, :class_name => "User"
belongs_to :editor, :class_name => "User"
validates_presence_of :creator, :editor
end
Run Code Online (Sandbox Code Playgroud)
当我尝试保存第一个用户时出现问题.还没有其他用户存在,但我没有null editor_id或creator_id.如果我尝试将编辑器和创建者设置为自己,我会得到堆栈溢出.
从理论上讲,所有用户(第一个除外)都有创建者和编辑者是有道理的.有没有办法在不暂时删除非null约束的情况下完成此操作?
我有两节课
public PartMap()
{
Id(x => x.ID).GeneratedBy.Guid();
HasOne(x => x.Stock)
.Cascade.All();
}
public Stock
{
Id(x => x.ID).GeneratedBy.Guid();
References(x => x.Part);
}
Run Code Online (Sandbox Code Playgroud)
零件只有一只库存,这就是我使用HasOne的原因。数据已插入好,我有一个零件,一个库存,它们已保存好。我的问题是,当尝试删除时,我收到一个错误,指出零件的库存前期密钥已被违反
"ORA-02292: integrity constraint (PRINERGY.FK121AD9E59966BE23) violated " .
Run Code Online (Sandbox Code Playgroud)
我看到它尝试删除零件而不删除相关库存。我该如何解决?
什么样的键盘布局可以输入ISO 8859-1字符?
需要输入的例子有: -
ÁnamàbìaèbèaÓgbuá
foreign-keys iso-8859-1 internationalization character-encoding
模型的外键未出现在Django管理站点中。这与是否在ModelAdmin实例中显式指定字段无关(fields =('title','field-that-does-not-show-up'))。
我意识到有很多变量可能导致这种现象。
class AdvertiserAdmin(admin.ModelAdmin):
search_fields = ['company_name', 'website']
list_display = ['company_name', 'website', 'user']
class AdBaseAdmin(admin.ModelAdmin):
list_display = ['title', 'url', 'advertiser', 'since', 'updated', 'enabled']
list_filter = ['updated', 'enabled', 'since', 'updated', 'zone']
search_fields = ['title', 'url']
Run Code Online (Sandbox Code Playgroud)
问题是广告客户外键未显示在AdBase的管理员中
class Advertiser(models.Model):
""" A Model for our Advertiser
"""
company_name = models.CharField(max_length=255)
website = models.URLField(verify_exists=True)
user = models.ForeignKey(User)
def __unicode__(self):
return "%s" % self.company_name
def get_website_url(self):
return "%s" % self.website
class AdBase(models.Model):
"""
This is our base model, from which all ads will inherit. …Run Code Online (Sandbox Code Playgroud) 我已经了解到在sqlite中启用FK约束的唯一方法是打开这个pragma:
PRAGMA foreign_keys = ON;
Run Code Online (Sandbox Code Playgroud)
但不幸的是,如果我理解正确,我将不得不在每个会话开始时执行该查询.我对么?我怎么能用NHibernate"自动"做到这一点?有没有办法挂钩NH并在打开会话后立即执行?我正在使用NH 3.0.
假设我们有2个表,a和b:
CREATE TABLE a (id_a INT NOT NULL PRIMARY KEY, id_b INT NOT NULL)
INDEX fk_id_b (id_b ASC),
CONSTRAINT fk_id_b FOREIGN KEY (id_b)
REFERENCES b (id_b);
CREATE TABLE b (id_b INT NOT NULL PRIMARY KEY, b_data INT NOT NULL);Run Code Online (Sandbox Code Playgroud)
所以a有以下列:id_a和id_b,其中id_b是bs 的外键id_b.当我想从a获取关联的b_data时,我必须进行连接:
SELECT id_a, b_data FROM a JOIN b ON a.id_b=b.id_b;Run Code Online (Sandbox Code Playgroud)
它工作正常,但它很长,我重复自己(我不应该根据红宝石家伙),所以我想到了一种方法,使这个查询更短,更容易理解,仍然是明确的:
SELECT id_a, id_b->b_data FROM a;Run Code Online (Sandbox Code Playgroud)
foreign_key->column 就像指向结构的指针一样,数据库会自动加入所需的表.
我知道这不存在,将其作为标准可能需要花费很多时间才能在生产就绪的数据库系统中看到它并且有些人不希望它"看起来很奇怪",但我会至少想知道,如果有可能,如果没有,为什么.
我正在开发一个类似于服务台的系统,并且我想使用外键来确保数据库结构合理,但是我不知道是否应该使用它们以及如何正确使用它们。
是否有关于如何(以及何时)使用外键的良好教程?
编辑我最困惑的部分是ON DELETE .. ON UPDATE ..部分,假设我有以下表格
table 'users'
id int PK auto_increment
department_id int FK (departments.department_id) NULL
name varchar
table 'departments'
id int PK auto_increment
name
Run Code Online (Sandbox Code Playgroud)
users.department_id是department.department_id的外键,当我要删除部门或用户时,ON UPDATE和ON DELETE函数在这里如何工作?
我正在尝试删除表的所有外键.首先,我使用meta.getExportedKeys(null, null, table);和获取这些键的所有名称rs.getString("FK_NAME").
但是当我尝试删除此密钥时使用:
ALTER TABLE tablename DROP CONSTRAINT fkname
Run Code Online (Sandbox Code Playgroud)
它只适用于某些键.有时我会得到:
ORA-02443: Cannot drop constraint - nonexistent constraint
Run Code Online (Sandbox Code Playgroud)
但外键确实存在.我究竟做错了什么?
我有这个模拟数据库:
用户:
公司:
特许经营:
商店:
这些都是主键和外键.
我想知道如果把做user_id放在特许经营表中是不好的做法.
这样我可以在没有所有关系的情况下进行报告,并且万一"丢失"我可以找到它的去向.它们不是数据库中定义的外键,但它们看起来像外键.或者我应该把它们变成外键?
谢谢您的意见.
编辑:我还认为像我一样思考的非规范化可能有助于加快速度,而不必使用所有连接.
foreign-keys ×10
oracle ×3
sql ×2
constraints ×1
django ×1
django-admin ×1
iso-8859-1 ×1
jdbc ×1
metadata ×1
mysql ×1
nhibernate ×1
sqlite ×1