foreignkey (foreign怎么读)_热门资讯_【搜客吧】_激活码商城_营销软件商城_微商软件

【同步智客】

同步智客

【代理加盟】

代理加盟

【综合商城】

软件商城

【微商必备】

微商必备

【营销必备】

营销必备

【知识付费】

知识付费

【代理项目落地训练营】

项目落地训练营

foreignkey (foreign怎么读)

suetone 2024-03-26 4浏览 0评论

foreignkey (foreign怎么读)

让我们来探讨“foreignkey”的含义和作用。在数据库中,外键(foreign key)是一种用来建立表与表之间关联关系的机制。外键通常用于在一个表中引用另一个表的主键,从而实现表与表之间的数据完整性和一致性。

在关系数据库中,外键在定义表结构时起着重要的作用。通过在一个表中设置外键,可以确保在与其他表进行关联时,只能引用其他表中已存在的数据。这有助于维护数据库的一致性,防止数据的不一致性和冗余。

外键通常由两部分组成:引用外键的表和被引用的表。引用外键的表包含外键列,它引用被引用表中的主键列。通过这种关联,我们可以在两个表之间建立关系,并且可以在查询时使用外键来获取其关联表中的数据。

外键的作用不仅在于建立表与表之间的关系,还可以在数据操作中起到保障数据完整性的作用。当我们尝试向引用外键表插入数据时,数据库会检查插入的数据是否在被引用表中存在,如果不存在,将会阻止插入操作,从而避免引入无效数据。

外键还可以帮助我们进行级联操作。级联操作是指当我们对引用外键表进行更新或删除操作时,数据库可以自动对关联的被引用表进行相应的更新或删除。这样可以确保数据之间的关联性和一致性,避免出现数据不一致的情况。

在使用外键时,需要注意一些细节。在设计数据库时,需要谨慎选择哪些字段需要设置为外键,以确保数据的合理性和完整性。需要考虑外键的索引问题,合理地创建索引可以提高外键的查询效率。还需要注意外键约束的性能影响,过多的外键约束可能会影响数据库的性能。

外键是关系数据库中的重要概念,它可以帮助我们建立表与表之间的关联关系,确保数据的完整性和一致性,提高数据库的可靠性和安全性。通过合理地设计和使用外键,我们可以更加有效地管理数据库中的数据,减少数据冗余和错误,从而提升数据库的性能和可维护性。


对数据库的操作出现了问题.

NSERT语句与FOREIGNKEY约束FK_VoteOptions_z_VoteInfo冲突。 该冲突发生于数据库vote,表dbo.z_VoteInfo,columnVote_ID。 不知道你数据库了解多少,从上面的例子来看是数据库内部出现问题而这个错误是很常见的!如果你有两个表比如说学生表,学生成绩表学生表当然是记录学生的基本资料的这个表里面有一个pkid也就是自动编号好学生成绩表里面有一个typeid绑定于学生表的自动编号(foreignkey),这样做的好处就是没有存储重复的数据,并且可以快速的联系到学生资料!好假如说你的学生表里面有3个同学,那么自动编号就有3个,分别对应于每一个同学,假设自动编号的值分别是1,2,3,那么这个时候插入到学生成绩表的时候的那个typeid字段的值就只能是1,2,3的其中一个,否则就会如提示你的错误一样我想我应该描述清楚了!其实你可以删除掉约束,但是这样做的后果就是很有可能让你的数据对应出现混乱!我给你写一个数据库的例子--用户表以及用户blog表createtableuserinfo(idintprimarykeyidentity(1,1),namevarchar(30)uniquenotnull,agetinyintcheck(age>0andage<=120))--为了简单,就只有一个文章标题,分类也去掉createtableblogs(idintprimarykeyidentity(1,1),typeidintconstraintmyfkforeignkey(typeid)referencesuserinfo(id),captionvarchar(50),)insertintouserinfovalues(a,3)select*fromuserinfo--自动编号为1,反正blogs的typeid字段的值只能是userinfo中的id字段的值的其中一个,如果--插入userinfo字段没有的数据到typeid中,那么就会错误insertintoblogsvalues(2,a)--错误insertintoblogsvalues(1,a)--正确--insertintoblogsvalues(2,a)这个语句是错误的,如果你非要这样,那么只能够删掉约束altertableblogsdropconstraintmyfk--myfk是约束名,对应于你的是FK_VoteOptions_z_VoteInfoinsertintoblogsvalues(2,a)--这个时候就可以插入了,但是数据就不能正确对应了!说了这么多,我想你应该可以明白!

MVC 模型里如何设置默认值,比如 CreateDate设置成 获取当前时间,迁移到数据库里就是Getdate()

Model是django项目的基础,如果一开始没有好好设计好,那么在接下来的开发过程中就会遇到的问题.然而,大多数的开发人员都容易在缺少思考的情况下随意的增加或修改model.这样做的后果就是,在接下来的开发过程中,我们不得不做出努力来修正这些错误.因此,在修改model时,一定尽可能的经过充分的考虑再行动!以下列出的是我们经常用到的一些工具和技巧:South,用于数据迁移,我们会在每个django项目中都用到.但到django1.7时,将会有代替-model-utils,用于处理常见的模式,例如-extensions,主要用到shell_plus命令,该命令会在shell中自动载入所有的app的model1.基本原则第一,将model分布于不同的app中.如果你的django项目中,有一个app拥有超过20个model,那么,你就应当考虑分拆该app了.我们推荐每个app拥有不超过5个model.第二,尽量使用ORM.我们需要的大多数数据库索引都能通过Object-Relational-Model实现,且ORM带给我们许多快捷方式,例如生成SQL语句,读取/更新数据库时的安全验证.因此,如果能使用简单的ORM语句完成的,应当尽量使用ORM.只有当纯SQL语句极大地简化了ORM语句时,才使用纯SQL语句.并且,在写纯SQL语句是,应当优先考虑使用raw(),再是extra().第三,必要时添加index.添加db_index=True到model中非常简单,但难的是理解何时应该添加.在建立model时,我们事先不会添加index,只有当以下情况时,才会考虑添加index:在所有的数据库查询中使用率在10%-25%时或当有真实的数据,或能正确估计出使用index后的效果确实满意时第四,注意model的继承的继承在django中需要十分小心,django提供了三种继承方式,继承(不要和Pyhton标准库的abc模块搞混),2.多表(multi-table)继承,继承.下表罗列了这三种继承的优劣:model继承类型优势劣势不使用继承,即每个相同的field会重复出现在不同的model中容易明白model和数据表的关系如果有大量相同的field,会较难维护abstractbaseclass继承,即只有继承自该类的model才会有数据表,其自身没有对应的数据表不用在每个model重复编写相同的field.也没有多表继承带来的过多消耗无法单独使用其共同的abstractbaseclass多表(multi-table)继承每个model都有数据表,因此可以既使用母表,又使用子表.也能通过从母表访问子表增加了消耗,因为每次查询子表,都会自动查询其母表.强烈建议不使用这一方法!proxymodel继承,即只有原始model才会有相应的数据表在不建立新数据表的情况下,使我们拥有不同行为的model无法修改model的fielddjango的创造者和其他许多开发人员都认为,多表继承的方法不是一个良好的方法.因此我们强烈建议大家不要使用该方法.下面列举了一些常见的如何选择model继承的情形:如果只有少数model拥有重复的field时,大可不必使用model继承,只需要在每个model中添加这些相同的field即可.如果有足够的model拥有重复的field时,大多是情况下,可以使用abstractbaseclass继承,将相同的field提取到abstractbaseclass中继承很少被用到,和其他两种继承也有着许多不一样之处.请不要使用多表(multi-table)继承,因为它既消耗资源又复杂,如果可以,尽量使用OneToOneFields和ForeignKeys代替项目中,创建时间和修改时间这两个field是最用到的,下面给出一个abstractbaseclass继承的例子:#():abstractbaseclass,提供创建时间和修改时间两个通用的fieldcreated=(auto_now_add=True)modified=(auto_now=True)classMeta:abstract=True注意以上代码的最后两行,正式这两行将这一model变味了abstractbaseclass,下面以TimeStampedModel为abstractbaseclass建立(TimeStampedModel):title=(max_length=200)以上两个class,在执行syncdb时,只会建立一个数据表,这也正是我们希望得到的.第五,使用south进行数据迁移,可以参见以前的文章:如何在Django中使用django-south,实现数据迁移(datamigrations)的设计如何设计出好的djangomodel可能是最难也是最复杂的一个话题了,在此,我们看看一些基本的技巧吧:a.规范化我们首先建议了解数据库规范化(databasenormalization).如果你还不清楚这是什么,那么,我们强烈建议你先阅读一下相关的书籍,或搜索关系型数据库设计或数据库规范化.在创建djangomodel之前,应当首先保证设计的数据库是规范化的正确的使用cache能帮助我们提高数据库的性能.详细的信息,我们会在今后的文章中作进一步介绍.c.何时使用null和blank当定义modelfield时,我们可以设置null=True和blank=True(默认都是False),知道何时设置null和blank对于开发人员也是十分重要的,在下面的表格中,我们一一列举了如何使用这两个选项:Field类型设置null=True设置blank=TrueCharField,TextField,SlugField,EmailField,CommaSeparatedIntegerField等不要设置django规定储存空字符串来代表空值,当从数据库中读取NULL或空值时都为空字符串可以设置设置后允许接受widget中为空值(即不填写),储存到数据库时空值变为空字符串FileField,ImageField不要设置django实际储存的是路径的字符串,因此同上可以设置同上BooleanField不要设置因为有NullBooleanField代替不要设置IntegerField,FloatField,DecimalField等可以设置如果你希望在数据库中能储存NULL可以设置设置后允许接受widget中为空值(即不填写),设置为True时必须同时设置null=TrueDateTimeField,DateField,TimeField等可以设置如果你希望在数据库中能储存NULL可以设置设置后允许接受widget中为空值(即不填写),设置为True时必须同时设置null=TrueForeignKey,ManyToManyField,OneToOneField可以设置如果你希望在数据库中能储存NULL可以设置设置后允许接受widget中为空值(即不填写)GenericIPAddressField可以设置如果你希望在数据库中能储存NULL可以设置设置后允许接受widget中为空值(即不填写)IPAddressField不推荐设置用GenericIPAddressField代替不推荐设置用GenericIPAddressField代替d.什么时候使用BinaryField在django1.6中,新增了BinaryField,用于储存二进制数据(binarydata或bytes).对于BinaryField,我们无法使用ORM的filters,excludes或其他SQL操作.但在少数情况下,我们会用到BinaryField,例如MessagePack格式的内容,传感器接受的原始数据和压缩数据等.但需要注意的是,BinaryData一般都十分庞大,因此可能会拖慢数据库的速度.如果发生这一现象,我们可以将binarydata储存在文件中,然后使用FileField储存该文件的路径信息.还有,不要从BinaryField中直接读取文件并呈献给用户.因为,1.从数据库读写总是比从文件系统读写慢;2.数据库备份会变得十分庞大,花费的时间;3.获得文件的过程,增加了从django到数据库的这一环节.3.不要替换默认的ModelManager从ORM获取model,实际上是通过django中的Modelmanager完成的,django为每一个model提供了默认的modelmanager,我们不建议将其替换掉,因为:当使用model继承时,model会继承abstractbaseclassmodel的modelmanager,而不会继承非abstractbaseclass的的第一个modelmanager通常作为默认的manager,当被替换时,可能会发生不可预测的问题.4.数据库事务(Transaction)在django1.6中,ORM默认会autocommit每一个数据库查询,也就是说,每次使用()或()时,在数据库中马上就会做出相应的修改.这样做的好处就是简化了初学者对ORM的理解.但坏处就是,当一个view中包含两个数据库修改,可能一个成功,但另一个失败,这就可能导致数据库不完整,给我们带来很大的危险.解决这一问题的方法就是使用数据库transaction,即将一系列数据库操作包含在一个transaction中,当其中有一个失败时,其他操作也会自动回退1.6为我们带来了一套崭新的既简单又强大的transaction机制,使我们方便的使用数据库transaction.a.将整个httprequest包裹在transaction中django给我们提供了一个简单地方法,将一个httprequest中的所有数据库操作包裹在transaction中:#setting/={default:{_psycopg2,NAME:,USER:,PASSWORD:,HOST:,PORT:,ATOMIC_REQUESTS:True,}}只需要在数据库设置中加入ATOMIC_REQUESTS:True选项,就能将整个httprequest包裹在transaction中.这样做的好处显而易见是是安全,但坏处则是性能可能会下降,因此随着流量的增大,我们必须采取更针对性的transaction.其次,需要注意的是,回退的只是数据库的状态,而不包括其他费数据库项,例如发送email等.所以当涉及这些非数据库项时,我们应当使用_atomic_request()修饰(decorate)这些view:#myapp/#此时ATOMIC_REQUESTS设置为_object_or__atomic_requests#以下httprequest不被包裹在一个transaction中defdo_something_to_article(request,pk,title):article=get_object_or_404(Article,pk=pk)#以下代码会以django默认的autocommit模式执行=()()()#以下代码被包裹在另一个transaction中==()()returnHttpResponse(success!)#如果以上transaction失败了,返回错误状态returnHttpResponse(oops!failed,status_code=400)b.更明确地transaction控制更明确地transaction控制意味着提高真题webapp的性能,但也意味着的开发时间.大多数网站下,由于有限的流量,使用ATOMIC_REQUESTS已经足够.在使用手动transaction控制时,应当注意:不做数据修改的操作,应当排除在transaction之外做数据修改的操作,则应在transaction内特殊情况下,可以违反以上两条需要注意的是,当view返回的是时,应当设置ATOMIC_REQUESTS为false,或使用_atomic_requests将该view修饰.因为对于view本身,是可以使用transaction的,但对于之后生成的responsestream触发的额外SQL查询,会自动变为django默认的autocommit模式中使用transaction注意,如果你使用的是MySQL,且数据表类型是MyISAM,那么transaction可能无法使用.无论你的设置是怎么样,当transaction无法使用时,django会自动转化为autocommit模式.

如何正确的使用和设置Database和Model

foreignkey (foreign怎么读) 第1张

Model是django项目的基础, 如果一开始没有好好设计好, 那么在接下来的开发过程中就会遇到更多的问题. 然而, 大多数的开发人员都容易在缺少思考 的情况下随意的增加或修改model. 这样做的后果就是, 在接下来的开发过程中, 我们不得不做出更多努力来修正这些错误. 因此, 在修改model时, 一定尽可能的经过充分的考虑再行动! 以下列出的是我们经常用到的一些工具和技巧: South, 用于数据迁移, 我们会在每个django项目中都用到. 但到django 1.7时, 将会有代替-model-utils, 用于处理常见的模式, 例如-extensions, 主要用到shell_plus命令, 该命令会在shell中自动载入所有的app的model 1. 基本原则 第一, 将model分布于不同的app中. 如果你的django项目中, 有一个app拥有超过20个model, 那么, 你就应当考虑分拆该app了. 我们推荐每个app拥 有不超过5个model. 第二, 尽量使用ORM. 我们需要的大多数数据库索引都能通过Object-Relational-Model实现, 且ORM带给我们许多快捷方式, 例如生成SQL语句, 读取/更新数据库时的安全验证. 因此, 如果能使用简单的ORM语句完成的, 应当尽量使用ORM. 只有当纯SQL语句极大地简化了ORM语句时, 才使用纯SQL语句. 并且, 在写纯SQL语句是, 应当优先考虑使用raw(), 再是extra(). 第三, 必要时添加index. 添加db_index=True到model中非常简单, 但难的是理解何时应该添加. 在建立model时, 我们事先不会添加index, 只有当 以下情况时, 才会考虑添加index: 在所有的数据库查询中使用率在10%-25%时或当有真实的数据, 或能正确估计出使用index后的效果确实满意时 第四, 注意model的继承. model的继承在django中需要十分小心, django提供了三种继承方式, base class继承(不要和Pyhton标准库的abc模块 搞混), 2.多表(multi-table)继承, model继承. 下表罗列了这三种继承的优劣:model继承类型优势劣势不使用继承, 即每个相同的field会重复出现在不同的model中容易明白model和数据表的关系如果有大量相同的field, 会较难维护abstract base class继承, 即只有继承自该类的model才会有数据表, 其自身没有对应的数据表不用在每个model重复编写相同的field. 也没有多表继承带来的过多消耗无法单独使用其共同的abstract base class多表(multi-table)继承每个model都有数据表, 因此可以既使用母表, 又使用子表. 也能通过从母表访问子表增加了消耗, 因为每次查询子表, 都会自动查询其母表. 强烈建议不使用这一方法!proxy model继承, 即只有原始model才会有相应的数据表在不建立新数据表的情况下, 使我们拥有不同行为的model无法修改model的fielddjango的创造者和其他许多开发人员都认为, 多表继承的方法不是一个良好的方法. 因此我们强烈建议大家不要使用该方法. 下面列举了一些常见的如何 选择model继承的情形: 如果只有少数model拥有重复的field时, 大可不必使用model继承, 只需要在每个model中添加这些相同的field即可.如果有足够的model拥有重复的field时, 大多是情况下, 可以使用abstract base class继承, 将相同的field提取到abstract base class 中 model继承很少被用到, 和其他两种继承也有着许多不一样之处.请不要使用多表(multi-table)继承, 因为它既消耗资源又复杂, 如果可以, 尽量使用OneToOneFields和ForeignKeys代替. django项目中, 创建时间和修改时间这两个field是最用到的, 下面给出一个abstract base class继承的例子: # import modelsclass TimeStampedModel():abstract base class, 提供创建时间和修改时间两个通用的fieldcreated = (auto_now_add=True)modified = (auto_now=True)class Meta:abstract = True注意以上代码的最后两行, 正式这两行将这一model变味了abstract base class, 下面以TimeStampedModel为abstract base class建立model: from import Article(TimeStampedModel):title = (max_length=200)以上两个class, 在执行syncdb时, 只会建立一个数据表, 这也正是我们希望得到的. 第五, 使用south进行数据迁移, 可以参见以前的文章:如何在 Django 中使用 django-south, 实现数据迁移 (data migrations)2. Django Model的设计 如何设计出好的django model可能是最难也是最复杂的一个话题了, 在此, 我们看看一些基本的技巧吧: a. 规范化 我们首先建议了解数据库规范化(database normalization). 如果你还不清楚这是什么, 那么, 我们强烈建议你先阅读一下相关的书籍, 或搜索关系 型数据库设计或数据库规范化. 在创建django model之前, 应当首先保证设计的数据库是规范化的. b. cache 正确的使用cache能帮助我们提高数据库的性能. 详细的信息, 我们会在今后的文章中作进一步介绍. c. 何时使用null和blank 当定义model field时, 我们可以设置null=True和blank=True (默认都是False), 知道何时设置null和blank对于开发人员也是十分重要的, 在下 面的表格中, 我们一一列举了如何使用这两个选项:Field 类型 设置null=True 设置blank=TrueCharField,TextField,SlugField,EmailField,CommaSeparatedIntegerField等不要设置django规定储存空字符串来代表空值, 当从数据库中读取NULL或空值时都为空字符串可以设置设置后允许接受widget中为空值(即不填写), 储存到数据库时空值变为空字符串FileField,ImageField不要设置django实际储存的是路径的字符串, 因此同上可以设置同上BooleanField不要设置因为有NullBooleanField代替不要设置IntegerField,FloatField,DecimalField等可以设置如果你希望在数据库中能储存NULL可以设置设置后允许接受widget中为空值(即不填写), 设置为True时必须同时设置null=TrueDateTimeField,DateField,TimeField等可以设置如果你希望在数据库中能储存NULL可以设置设置后允许接受widget中为空值(即不填写), 设置为True时必须同时设置null=TrueForeignKey,ManyToManyField,OneToOneField可以设置如果你希望在数据库中能储存NULL可以设置设置后允许接受widget中为空值(即不填写)GenericIPAddressField可以设置如果你希望在数据库中能储存NULL可以设置设置后允许接受widget中为空值(即不填写)IPAddressField不推荐设置用GenericIPAddressField代替不推荐设置用GenericIPAddressField代替d. 什么时候使用BinaryField 在django 1.6中, 新增了BinaryField, 用于储存二进制数据(binary data或 bytes). 对于BinaryField, 我们无法使用ORM的filters, excludes或其他SQL操作. 但在少数情况下, 我们会用到BinaryField, 例如MessagePack格式的内容, 传感器接受的原始数据和压缩数据等. 但需要注意 的是, Binary Data一般都十分庞大, 因此可能会拖慢数据库的速度. 如果发生这一现象, 我们可以将binary data储存在文件中, 然后使用FileField储 存该文件的路径信息. 还有, 不要从BinaryField中直接读取文件并呈献给用户. 因为, 1. 从数据库读写总是比从文件系统读写慢; 2. 数据库备份会变得十分庞大, 花费更多 的时间; 3. 获得文件的过程, 增加了从django到数据库的这一环节. 3. 不要替换默认的Model Manager 从ORM获取model, 实际上是通过django中的Model manager完成的, django为每一个model提供了默认的model manager, 我们不建议将其替换掉, 因为: 当使用model继承时, model会继承 abstract base class model的model manager, 而不会继承非abstract base class的的第一个model manager通常作为默认的manager, 当被替换时, 可能会发生不可预测的问题. 4. 数据库事务 (Transaction) 在django 1.6中, ORM默认会autocommit每一个数据库查询, 也就是说, 每次使用()或()时, 在数据库中马上就会做出相应的修 改. 这样做的好处就是简化了初学者对ORM的理解. 但坏处就是, 当一个view中包含两个数据库修改, 可能一个成功, 但另一个失败, 这就可能导致数据库不 完整, 给我们带来很大的危险. 解决这一问题的方法就是使用数据库transaction, 即将一系列数据库操作包含在一个transaction中, 当其中有一个失败时, 其他操作也会自动回退. Django 1.6 为我们带来了一套崭新的既简单又强大的transaction机制, 使我们方便的使用数据库transaction. a. 将整个http request包裹在transaction中 django给我们提供了一个简单地方法, 将一个http request中的所有数据库操作包裹在transaction中: # setting/ = {default: {ENGINE: _psycopg2,NAME: ,USER: ,PASSWORD: ,HOST: ,PORT: ,ATOMIC_REQUESTS: True,}}只需要在数据库设置中加入ATOMIC_REQUESTS: True选项, 就能将整个http request包裹在transaction中. 这样做的好处显而易见是是安全, 但 坏处则是性能可能会下降, 因此随着流量的增大, 我们必须采取更针对性的transaction. 其次, 需要注意的是, 回退的只是数据库的状态, 而不包括其他费 数据库项, 例如发送email等. 所以当涉及这些非数据库项时, 我们应当使用_atomic_request()修饰(decorate)这些view: # myapp/# 此时ATOMIC_REQUESTS设置为 Truefrom import transactionfrom import HttpResponsefrom import get_object_or_404from import timezonefrom import _atomic_requests # 以下http request不被包裹在一个transaction中def do_something_to_article(request, pk, title):article = get_object_or_404(Article, pk=pk)# 以下代码会以django默认的autocommit模式执行 = ()()with ()# 以下代码被包裹在另一个transaction中 = = ()()return HttpResponse(success!)# 如果以上transaction失败了, 返回错误状态return HttpResponse(oops! failed, status_code=400)b. 更明确地transaction控制 更明确地transaction控制意味着提高真题web app的性能, 但也意味着更多的开发时间. 大多数网站下, 由于有限的流量, 使用ATOMIC_REQUESTS已 经足够. 在使用手动transaction控制时, 应当注意: 不做数据修改的操作, 应当排除在transaction之外做数据修改的操作, 则应在transaction内特殊情况下, 可以违反以上两条 需要注意的是, 当view返回的是时, 应当设置ATOMIC_REQUESTS为false, 或使用 _atomic_requests将该view修饰. 因为对于view本身, 是可以使用transaction的, 但对于之后生成的response stream触发的额 外SQL查询, 会自动变为django默认的autocommit模式. c. MySQL中使用transaction 注意, 如果你使用的是MySQL, 且数据表类型是MyISAM, 那么transaction可能无法使用. 无论你的设置是怎么样, 当transaction无法使用时, django会自动转化为autocommit模式.

若对本页面资源感兴趣,请点击下方或右方图片,注册登录后

搜索本页相关的【资源名】【软件名】【功能词】或有关的关键词,即可找到您想要的资源

如有其他疑问,请咨询右下角【在线客服】,谢谢支持!

foreignkey (foreign怎么读) 第2张
发表评论
欢迎你第一次访问网站!