该模型的逻辑是:
Building有很多RoomsRoom可能在另一个内部Room(例如,一个壁橱 - 在'self'上的ForeignKey) Room只能Room在同一建筑物内的另一个内部(这是棘手的部分) 这是我的代码:
#spaces/models.py
from django.db import models
class Building(models.Model):
name=models.CharField(max_length=32)
def __unicode__(self):
return self.name
class Room(models.Model):
number=models.CharField(max_length=8)
building=models.ForeignKey(Building)
inside_room=models.ForeignKey('self',blank=True,null=True)
def __unicode__(self):
return self.number
Run Code Online (Sandbox Code Playgroud)
和:
#spaces/admin.py
from ex.spaces.models import Building, Room
from django.contrib import admin
class RoomAdmin(admin.ModelAdmin):
pass
class RoomInline(admin.TabularInline):
model = Room
extra = 2
class BuildingAdmin(admin.ModelAdmin):
inlines=[RoomInline]
admin.site.register(Building, BuildingAdmin)
admin.site.register(Room)
Run Code Online (Sandbox Code Playgroud)
内联将仅显示当前建筑物中的房间(这是我想要的).但问题是,对于inside_room下拉列表,它会显示Rooms表中的所有房间(包括其他建筑物中的房间).
在内联中rooms,我需要将inside_room选择限制rooms在当前building(当前正由主BuildingAdmin …
以下SQL语句是否会自动在Table1.Table1Column上创建索引,还是必须显式创建索引?
数据库引擎是SQL Server 2000
CREATE TABLE [Table1] (
. . .
CONSTRAINT [FK_Table1_Table2] FOREIGN KEY
(
[Table1Column]
) REFERENCES [Table2] (
[Table2ID]
)
)
Run Code Online (Sandbox Code Playgroud) 我有一个模型Coupon,以及一个Photo带有ForeignKey它的模型:
class Photo(models.Model):
coupon = models.ForeignKey(Coupon,
related_name='description_photos')
title = models.CharField(max_length=100)
image = models.ImageField(upload_to='images')
Run Code Online (Sandbox Code Playgroud)
我在管理员中设置内联,所以现在我可以将照片添加到管理员的优惠券中.
我尝试添加一个,上传成功,但后来我得到Django的调试页面,出现此错误:
IntegrityError at /admin/coupon/coupon/321/
(1452, 'Cannot add or update a child row: a foreign key constraint fails (`my_project`.`coupon_photo`, CONSTRAINT `coupon_id_refs_id_90d7f06` FOREIGN KEY (`coupon_id`) REFERENCES `coupon_coupon` (`id`))')
Run Code Online (Sandbox Code Playgroud)
这是什么以及如何解决这个问题?
(如果重要,这是一个MySQL数据库.)
编辑:我在一个Sqlite3数据库上尝试了它,它有一个稍微不同的数据集,并且它有效,所以在我当前的数据库中可能有松散的数据?我怎样才能找到并删除它?
我想从另一个表中删除外键,以便我可以插入我选择的值.
我是数据库的新手,所以请告诉我正确的sql查询删除或删除外键值.
我正拼凑一个图片网站.基本模式非常简单的MySQL,但是我在尝试表示与图像相关的可能管理标志("不合适","受版权保护"等)时遇到了一些麻烦.我目前的想法如下:
tblImages (
imageID INT UNSIGNED NOT NULL AUTO_INCREMENT,
...
);
tblImageFlags (
imageFlagID INT UNSIGNED NOT NULL AUTO_INCREMENT,
imageID INT UNSIGNED NOT NULL,
flagTypeID INT UNSIGNED NOT NULL,
resolutionTypeID INT UNSIGNED NOT NULL,
...
);
luResolutionTypes (
resolutionTypeID INT UNSIGNED NOT NULL AUTO_INCREMENT,
resolutionType VARCHAR(63) NOT NULL,
...
);
Run Code Online (Sandbox Code Playgroud)
(为了便于阅读而被截断;各种外键和索引都是有序的,我发誓)
tblImageFlags.flagTypeID在标志类型的查找表上是外键的,你可以想象tblImageFlags.resolutionTypeID 应该是外键的luResolutionTypes.resolutionTypeID.手头的问题是,当首次发布一个标志时,没有逻辑解决方案类型(我很好地宣称这个NULL); 但是,如果设置了一个值,它应该是外键键到查找表.
我找不到这种情况的MySQL语法解决方法.它存在吗?最佳参赛者是:
NULL条目luResolutionTypes.resolutionTypeID(这甚至可以在AUTO_INCREMENT列中工作吗?)感谢您的见解!
PS Bonus指向任何人告诉我,在数据库的情况下,它是"索引"还是"索引".
后续行动:感谢Bill Karwin指出了表格结构中出现的语法错误(NOT NULL如果您希望它允许,请不要设置列NULL …
在我深入潜入MongoDB几天之前,我想我会问一个非常基本的问题,我是否应该深入研究它.我基本上没有使用nosql的经验.
我确实读过一些文档数据库的一些好处,我认为对于这个新的应用程序,它们会非常棒.对于许多类型的对象(许多m-to-m关系)和子类来说,做收藏夹,评论等总是很麻烦 - 这是一种很难处理的问题.
我还有一个结构,在SQL中定义会很麻烦,因为它非常嵌套并且比15个不同的表更好地转换为文档.
但我对一些事情感到困惑.
是否可以保持数据库的标准化?我真的不想更新多条记录.这仍然是人们如何处理MongoDB中数据库的设计?
当用户收藏某本书并且此选择仍存储在用户文档中时,会发生什么情况,但该书籍会被删除?没有外键,关系如何分离?我自己负责删除所有链接吗?
如果用户喜欢不再存在的书并且我查询它(某种类型的连接)会发生什么?我必须在这里做任何容错吗?
我想删除包含外键的行,但是当我尝试这样的事情时:
DELETE FROM osoby WHERE id_osoby='1'
Run Code Online (Sandbox Code Playgroud)
我得到这个声明:
错误:表"osoby"上的更新或删除违反表"kontakty"上的外键约束"kontakty_ibfk_1"DETAIL:键(id_osoby)=(1)仍然从表"kontakty"引用.
如何删除这些行?
我有以下设置,
CREATE TABLE auth_user ( id int PRIMARY KEY );
CREATE TABLE links_chatpicmessage ();
Run Code Online (Sandbox Code Playgroud)
我正在尝试将一个名为senderto 的列添加links_chatpicmessage到另一个名为auth_user's idcolumn的表中.
为实现上述目标,我在终端上尝试以下方法:
ALTER TABLE links_chatpicmessage
ADD FOREIGN KEY (sender)
REFERENCES auth_user;
Run Code Online (Sandbox Code Playgroud)
但这给了我一个错误:
错误:外键约束中引用的列"sender"不存在
我该如何解决?
我想知道,如果它是用在InnoDB中可能MySQL有一个table与外键引用在不同的另一个表database?
如果是这样,如何做到这一点?
我有一组InnoDB表,我经常需要通过删除一些行并插入其他行来维护.其中一些表具有引用其他表的外键约束,因此这意味着表加载顺序很重要.要插入新行而不必担心表的顺序,我使用:
SET FOREIGN_KEY_CHECKS=0;
Run Code Online (Sandbox Code Playgroud)
之前,然后:
SET FOREIGN_KEY_CHECKS=1;
Run Code Online (Sandbox Code Playgroud)
后.
加载完成后,我想检查更新表中的数据是否仍然保持参照完整性 - 新行不会破坏外键约束 - 但似乎没有办法做到这一点.
作为测试,我输入的数据确实违反了外键约束,并且在重新启用外键检查时,mysql没有产生任何警告或错误.
如果我试图找到一种方法来指定表加载顺序,并在加载过程中留在了外键检查,这不会让我在具有自引用外键约束的表加载数据,因此这将不是一个可接受的解决方案
有没有办法强制InnoDB验证表或数据库的外键约束?
foreign-keys ×10
database ×5
mysql ×4
django ×2
innodb ×2
postgresql ×2
sql-server ×2
admin ×1
alter-table ×1
indexing ×1
inline ×1
limit ×1
mongodb ×1
nosql ×1
null ×1
orm ×1
sql ×1