请问一下,l5里怎么设置联合主键啊?

mysql数据库,表里有A和B,A自增,B根据A自增,比如A为1,B从1开始自增,A为2,B从1开始自增

这个要怎么写呢?请大家给个示例,谢谢
已邀请:

bobby

赞同来自: 娃娃脾气

好像是的呢,我直接执行SQL语句算了
DB::statement('ALTER TABLE system_item DROP PRIMARY KEY,ADD PRIMARY KEY (type_id, id)');

谢谢啦,回答了这么多

娃娃脾气

赞同来自:

mysql无法实现。至少laravel中没有这样的支持。
还有,你这不叫联合主键。可以叫条件自增。

bobby

赞同来自:

这个具体我也不知道是不是该叫联合主键还是复合主键,mysql语句是这样的
CREATE TABLE
NewTable
(
type_id
int(11) NOT NULL ,
id
int(11) NOT NULL AUTO_INCREMENT ,
name
varchar(255) NULL DEFAULT NULL ,
description
varchar(255) NULL DEFAULT NULL ,
PRIMARY KEY (
type_id
,
id
)
)
就是这样的语句应该怎么写

娃娃脾气

赞同来自:

$table->primary(array('id', 'type_id'));
但是,这并不能实现你所说的“A自增,B根据A自增,比如A为1,B从1开始自增,A为2,B从1开始自增”

它的作用是限制重复的出现,例如
只有id主键时:id不能重复
id & type_id复合主键: id = 1 & type_id=123 这样一行记录不能出现两次。
但是允许id = 1 & type_id=123 、 id = 1 & type_id=124 这样的两行记录。
具体请百度。

bobby

赞同来自:

谢谢了,恩,可能没表达清楚
后来看文档里也发现了
看文档的时候不够仔细

bobby

赞同来自:

再问一下,这个语句应该怎么写,
$table->integer('type_id');$table->increments('id');这样写了以后id就变成主键了,再用$table->primary(array('type_id','id'));就出错,好像这些方法里面自动增长的就一定会变成主键

建表之后用drop再primary也不行,there can be only one auto column and it must be defined as a key
直接用navicat里修改表,生成的语句是这样的
ALTER TABLE
newtable
DROP PRIMARY KEY,ADD PRIMARY KEY (
type_id
,
id
);
在一个语句里的,可以正确修改,如果拆成两个语句也不行。
这个如果用$table->这样的方法应该怎么写

娃娃脾气

赞同来自:

http://laravel-china.org/docs/ ... lumns
QQ图片20150515093054.png


遇到问题看文档,按下Ctrl再按F,再输入要查找的词,你就看到了问题所在。
记住:看文档!看文档!看文档!

bobby

赞同来自:

文档看了几遍,还是不知道应该怎样写好啊,能帮下不,把下面的sql转成$table->这样的,谢谢

CREATE TABLE NewTable(
type_id int(11) NOT NULL ,
id int(11) NOT NULL AUTO_INCREMENT ,
name varchar(255) NULL DEFAULT NULL ,
PRIMARY KEY (type_id,id)
)

娃娃脾气

赞同来自:

Schema::create('NewTable', function (Blueprint $table) {
        $table->integer('type_id')->unsigned();
        $table->integer('id')->unsigned();
        $table->string('name');
        $table->primary(array('type_id', 'id'));
        $table->timestamps();
    });

娃娃脾气

赞同来自:

然而你的sql是无法实现的。即使直接执行sql也不行。
因为自动递增会自动设置主键,但是如果id已经是主键了,又怎么能id&type_id联合主键呢?

bobby

赞同来自:

你的那个建的表最后id不是自增的。
我的SQL好像是执行不了,我剪辑过的,那来个完整的吧
CREATE TABLE `ssssss` (
`type_id`  int(11) NOT NULL ,
`id`  int(11) NOT NULL AUTO_INCREMENT ,
`name`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,
`description`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,
PRIMARY KEY (`type_id`, `id`),
INDEX `id` (`id`) USING BTREE 
)
ENGINE=MyISAM
DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci
AUTO_INCREMENT=16
CHECKSUM=0
ROW_FORMAT=DYNAMIC
DELAY_KEY_WRITE=0
;

捕获.PNG

娃娃脾气

赞同来自:

哈哈,无法实现。因为Laravel没有提供AUTO_INCREMENT方法。
但是提供了increments方法。
所以没法单独设置递增,只能设置递增+主键。
而id一旦成为主键,便没法成为复合主键了。

娃娃脾气

赞同来自:

而且坑爹的是,还没有取消主键的方法。所以先increments("id")再取消主键的思路也是行不通的。

要回复问题请先登录注册