我有一个在web2py中定义的表
db.define_table(
'pairing',
Field('user',writable=True,readable=True),
Field('uid', writable=True , readable=True)
)
Run Code Online (Sandbox Code Playgroud)
此表需要具有唯一的用户和uid组合.我查看了web2py文档,但没有直接的方法来定义组合键.我们如何在web2py中定义复合方式
我在sql server中有两个表:
第一个表Message_Child有一个复合主键(MessageId,ChildId)
Message_Child (MessageId, ChildId, Date)
Run Code Online (Sandbox Code Playgroud)
第二个表应该包含表的外键Message_Child,所以我创建了两列:MessageId和ChildId.
Request (RequestId, MessageId, ChildId, type)
Run Code Online (Sandbox Code Playgroud)
我创建了约束如下:
Alter table Request
ADD FOREIGN KEY (MessageId, ChildId) REFERENCES Message_Child(MessageId, ChildId);
Run Code Online (Sandbox Code Playgroud)
但是我收到以下错误:
引用的表'Message_Child'中没有主键或候选键与外键'FK_ Request _534D60F1' 中的引用列列表匹配.
编辑 添加代码:
Message_Child表:
CREATE TABLE [dbo].[Message_Child](
[ChildId] [int] NOT NULL,
[MessageId] [int] NOT NULL,
[Date] [datetime] NULL,
CONSTRAINT [PK_Message_Child] PRIMARY KEY CLUSTERED
(
[ChildId] ASC,
[MessageId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) …Run Code Online (Sandbox Code Playgroud) 我的Parent班级有两个子班级: Child和ParentHobby. Child 类有一个单一的 PK 并且@OneToMany它的映射有效。问题是我不知道如何将它映射到具有复合 PK 的 ParentHobby 类上。
家长:
//this works
@OneToMany(cascade = CascadeType.ALL, mappedBy = "parent", fetch = FetchType.EAGER)
private List<Child> childList;
//this DOES NOT work
@OneToMany(cascade = CascadeType.ALL, mappedBy = "parent", fetch = FetchType.EAGER)
private List<ParentHobby> hobbyList;
Run Code Online (Sandbox Code Playgroud)
孩子:
@Entity
@Table(name="CHILD")
public class Child {
@Id
@SequenceGenerator(name="CHILD_SEQ", sequenceName="CHILD_DB_SEQ", allocationSize = 1)
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="CHILD_SEQ")
@Column(name="CHILD_ID")
private long childID;
@JoinColumn(name = "PARENT_ID", referencedColumnName = "PARENT_ID", insertable = true, updatable = true)
@ManyToOne(optional …Run Code Online (Sandbox Code Playgroud) 我有一个包含 3 列的表格:A(数字)、B(数字)和 C(布尔值)。
我需要创建一个规则,以防止使用列 A 和 B 以及 C 等于 true 创建记录。例如。
这将被允许:
A B C
1 2 true
1 2 false
1 2 false
Run Code Online (Sandbox Code Playgroud)
但是这个,不:
A B C
1 2 true
1 2 true
1 2 false
Run Code Online (Sandbox Code Playgroud) 我看到存在多种方法来映射具有JPA 的复合键.
但在我的情况下有点不同:
我有一个只有2列的表:
mysql> desc mytable; +--------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +--------+-------------+------+-----+---------+-------+ | name | varchar(80) | NO | PRI | | | | tag | varchar(80) | NO | PRI | | | +--------+-------------+------+-----+---------+-------+
我的观点是:我是否需要创建一个新的(主键类)类来映射我的复合键?
我正在努力寻找最简单的方法.
有人可以帮我吗?
提前致谢!
我正在尝试这种方法:http://www.java.net/print/236710
我有两个表Part和SubPart.部分表具有一般字段,如id,name,desc等.SubPart表具有part_id,sub_part_id作为复合键.这两列都引用了Part表,并且每个列都有一对多的映射,就像Part表中的每个part_id一样,SubPart表中的两个列都可以有多个条目.我在定义SubPart表的复合键时遇到问题.我尝试了嵌入式标签,但它不起作用.我该如何解决这个问题.非常感谢.
像这样的零件表.
@Entity
@Table(name="Part")
public class Part {
@Id
@GeneratedValue
@Column(name="Part_Id")
private int id;
@Column(name="Part_Number")
private String partNumber;
@Column(name="Part_Name")
private String partName;
}
Run Code Online (Sandbox Code Playgroud)
子部件表
@Entity
@Table(name="SubPart")
public class SubPart {
// part and subPart combination is the compound key here.
@ManyToOne
@JoinColumn(name="Part_Id")
private Part part;
@ManyToOne
@JoinColumn(name="Sub_Part_Id")
private Part subPart;
@Column(name="Quantity")
private Integer quantity;
}
Run Code Online (Sandbox Code Playgroud) 编辑
这不是关于空间的问题,而是关于索引的唯一性,它会影响查询计划。
就基数而言,哪个索引场景更高:
一种
Table:
(
Col1 smallint,
Col2 smallint
)
Run Code Online (Sandbox Code Playgroud)
在哪里
Range Col1 : 0 - 1000
Range Col2 : 0 - 1000
Run Code Online (Sandbox Code Playgroud)
和 上的复合索引(Col1, Col2),始终按顺序查询。
乙
桌子:
(
Col1_2 int
)
Run Code Online (Sandbox Code Playgroud)
在哪里
Range Col1_2 : 0 - 1000^2
Run Code Online (Sandbox Code Playgroud)
以及(Col1_2)结合 Col1 和 Col2 组件的存储和查询的单个索引。
我基本上要问的是,将多个小数字组合在一起(散列)更好(如在索引使用中),还是没有区别?
postgresql indexing database-design composite-key database-indexes
由于MySQL不支持IF EXISTS,我很难想到在MySQL中执行类似下面伪操作的语法:
IF ((select count(*) from table where col1='var1' AND col2='var2' AND col3='var3' AND col4='var4' AND col5='var5')>0) then
combination of vars exist in record - do a thing;
ELSE
combination of vars does not exist in record - insert record;
END IF;
Run Code Online (Sandbox Code Playgroud)
我应该认为CASE适合这种情况,但对于我的生活,我无法想到正确的语法.我使用唯一索引,但每个列都需要允许重复,它只是所有列的匹配组合,需要是唯一的,而不是字段本身.
我被告知在所有列中使用复合键可以避免重复插入,但是从我收集的内容中我需要使用不同的插入.
简短版本:在MySQL中,如果在现有行中找不到精确指定的列匹配,如何插入新行.
任何建议或意见将不胜感激.
我需要知道复合键是否允许其中存在重复值?
例如:
我有 2 张桌子。
1)表“学生”,其中包含字段studentID(PK),标准,地址。
2) 表“Class”,其中包含字段 classID(PK)、classname、studentID(FK)。
通过将复合键设置为(classID,studentID),它是否允许重复值?
我想知道的是,是否有可能在类表的classID字段中输入重复的值?因为我无法在 classID 中输入重复的值,因为它是主键字段。
复合键能帮助我实现这一目标吗?请在这方面帮助我。
如果我创建一个带有复合键的表(一对多关系).如何确保一对多关系是单方面的?我的意思是A和B是复合键; A可以有多个B,但B不能有多个A.
编辑:将数据类型从数字更改为int
例如:
CREATE TABLE voting (
TaskOrder int,
MemberID int,
PRIMARY KEY (TaskOrder , MemberID)
);
Run Code Online (Sandbox Code Playgroud)
功能要求 - 一个成员可以有多个任务订单.但是,无法将一个任务订单分配给多个成员.
我如何确定?起初,我想过使用复合键.还有其他选择吗?或者使用复合键可以吗?
composite-key ×10
sql ×4
constraints ×2
hibernate ×2
java ×2
jpa ×2
mysql ×2
primary-key ×2
sql-server ×2
foreign-keys ×1
if-statement ×1
indexing ×1
one-to-many ×1
oracle ×1
postgresql ×1
python ×1
web2py ×1